2011-12-06 14 views
6

Ho un file jar che menziona la classe principale nel manifest. Quando provo ad eseguire il vaso utilizzando il seguente comandoL'opzione java -jar altera le opzioni del percorso di classe

java -cp .;./* com.foo.MainClass 

Il codice viene eseguito e lavora.

Quando provo ad eseguire il vaso utilizzando il seguente comando

java -cp .;./* -jar myjar.jar 

ottengo classe non execptions trovati per alcuni vasi che si trovano nella stessa cartella myjar.jar. Spero che l'opzione -cp includa quei jar nel percorso della classe. Ho modificato il mio codice per stampare la proprietà java.class.path. Nel primo caso elencava tutti i jar nella directory corrente, nel secondo caso elencava semplicemente myjar.jar

Ho anche modificato il manifest per aggiungere ad esso l'elemento Class-Path con tutti i jar. Quindi il secondo comando funziona. Ma nel mio codice sto provando a caricare una classe Aribtrary il cui nome è fornito al prompt dei comandi, quindi voglio che il percorso della classe contenga tutti i jar in una cartella. Come faccio a far funzionare il secondo comando in questo scenario?

+0

Dai un'occhiata a [OneJar] (http://one-jar.sourceforge.net/). Questo dovrebbe risolvere i tuoi problemi con il CP. – flash

+0

@flash: Probabilmente no. Dice che non conosce il percorso di classe extra in fase di compilazione (altrimenti potrebbe semplicemente aggiungerlo al manifest). – Thilo

+1

Sembra che tu debba usare il tuo proprio classloader (che aggiunge le cose in base al tuo ambiente). – Thilo

risposta

6

Da this,

un vaso eseguibile deve fare riferimento a tutti gli altri JAR dipendenti si richiede attraverso l'intestazione Class-Path del file manifesto. La variabile di ambiente CLASSPATH e qualsiasi percorso di classe specificato sulla riga di comando viene ignorata dalla JVM se si utilizza l'opzione -jar.

+0

Grazie! Questo significa che se voglio caricare una classe aribrary il cui file jar è presente nello stesso posto del mio file jar (e non menzionato nel mio manifest), ho bisogno di usare URLClassLoader per caricare esplicitamente quel jar? – mihirg

+0

Bene, potresti aggiungere qualcosa come 'plugins/*' al tuo classpath manifest. La cartella per i file jar sarebbe stata riparata, ma tutti i barattoli dovrebbero essere raccolti. – Thilo

+0

O forse no: "Tuttavia, i caratteri jolly del percorso classe non sono rispettati nell'intestazione jar-manifest Class-Path." :-( – Thilo

0

Here è una buona discussione su questo tema.

Problemi correlati