2010-02-09 9 views
9

Sto cercando di fare qualcosa che pensavo non sarebbe stato difficile.Java -jar: accesso al file di configurazione esterno

Ho un'applicazione che mi piacerebbe impacchettare come jar perché ho ~ 30 dipendenze e vorrei poter distribuire un singolo file.

Ho alcuni file di configurazione - un file di proprietà e un file di configurazione di primavera, e il mio file di log4 puntelli - che mi piacerebbe avere esterno al barattolo. Immagino che mi sarei aspettato che se li avessi messi nella stessa directory del barattolo li troverebbe quando è in esecuzione, ma non è così.

Durante lo sviluppo, ho questi file nella radice del classpath per il mio progetto eclipse e l'app li trova bene. Mi sento come se mi mancasse qualche aspetto chiave della teoria jar/classpath ...

quindi quello che voglio è essere in grado di mettere i file di configurazione e il jar nella stessa directory e fare in modo che l'app trovi i file di configurazione quando lo eseguo con la cosa java -jar standard.

Non c'è un modo semplice per raggiungere questo obiettivo?

risposta

11

io conserverò per i posteri la mia soluzione a questo problema.

Penso che sia possibile che mi aspettassi che java -jar faccia qualcosa che non funziona.

Se si utilizza il normale comando java è possibile includere il jar sul classpath e si finirà praticamente con la stessa cosa di java -jar, solo si deve assegnare un nome specifico alla classe che si desidera utilizzare.Ecco come si presenta:

java -cp .:path/to/Jar.jar com.company.package.Class arg1=val1 arg2=val2 .... 

È probabile che si sta andando a costruire uno script per avviare il programma per voi in ogni caso, in modo che la complessità della chiamata riga di comando in realtà non è un gran che, dal momento che' Lo costruirò solo una volta in ogni caso.

Vedrai che ho incluso "." come primo elemento sul classpath, il che significa che qualsiasi cosa nella stessa directory del jar verrà inclusa anche nel classpath. Ovviamente tutto il contenuto del barattolo è incluso anche nel classpath, poiché anche il jar stesso si trova sul classpath.

Si vedrà anche che ho mostrato come è ancora possibile consegnare arg sulla riga di comando. Era qualcosa di cui non ero sicuro quando ho iniziato, ma funziona come previsto.

Sono sicuro che questa è solo una conoscenza di base della distribuzione Java, ma per qualche motivo mi mancava.

Spero che questo aiuti qualcun altro. Certamente mi avrebbe risparmiato un sacco di tempo se qualcuno fosse stato in grado di dire "non preoccuparti di cercare di far funzionare la cosa -jar - basta usare il metodo -cp" ...

4

È necessario aggiungere "." al classpath del file jar che si sta creando per la propria applicazione.

Così nel manifesto, mi aspetto di vedere

Main-Class: some.full.Name 
Class-Path: . needed-lib.jar other-lib.jar 

Poi, quando si esegue la vostra applicazione eseguendo

java -jar myapp.jar 

utilizza effettivamente

java -classpath .;needed-lib.jar;other-lib.jar some.full.Name 

In questo modo anche qualsiasi file nella directory con il file myapp.jar si troverà sul classpath. Quel classpath è relativo alla posizione del barattolo che lo contiene.

Log4j per uno si aspetta che il file di configurazione log4j.xml si trovi sul classpath. Se non si utilizza il nome log4j.xml, è necessario aggiungere una proprietà di sistema al comando di avvio per indicare alla libreria log4j di cercare un nome diverso.

Non sono sicuro di ciò che Spring si aspetta per i file di configurazione. E il caricamento dei file di proprietà dipende dal meccanismo utilizzato per caricare il file. L'uso di un FileReader o InputStream non utilizza affatto il meccanismo del classpath. In tal caso è necessario sapere dove l'applicazione si aspetta che il file sia relativo alla directory di lavoro corrente.

+0

Grazie per la risposta Jay R . mio manifesto ha questo in esso, che credo sia quello che stai suggerendo: Manifest-Version: 1.0 main-Class: Class-Path:. – Joel

+0

Ho aggiunto altro alla mia risposta che spero aiuti. –

+0

Grazie ancora per la tua risposta Jay R. Il tuo aiuto è molto apprezzato. Tuttavia non ho molta fortuna. Sto usando il file log4j.properties piuttosto che la configurazione xml, ma penso che finché il file si trova sul classpath log4j dovrebbe trovarlo bene. Lo stesso accordo con il file di configurazione di primavera - sto chiamando il mio spring.xml ma finché non si trova sul classpath non ci dovrebbero essere problemi. My MANIFEST.MF viene generato dall'esportatore "Runnable Jar ..." di Eclipse, ma sembra esattamente come quello del campione. Non sono sicuro di cosa sta succedendo qui. Grazie ancora per la tua opinione. – Joel

2

Penso che si possa fare questo con un manifest nel jar per specificare il classpath che dovrebbe usare.

Modificato: somthing come This