2010-05-26 13 views
33

dalle mie letture, quando si esegue un comando come segue:includono vaso esterno durante l'esecuzione di java-jar

java -jar foo.jar 

Poi il percorso di classe principale viene ignorato, e il percorso di classe è tratto dal file manifesto.

Inoltre, il classpath dichiarato sulla riga di comando è anche ignorato. Quindi:

java -classpath /usr/local/jar/foobar.jar -jar foo.jar 

/usr/local/jar/foobar.jar viene ignorato.

Infine, ho letto che il file manifesto può contenere solo percorsi relativi, all'interno del file jar.

Quindi, come si fa a includere percorsi assoluti ai vasi esterni, che sono presenti nel sistema, ma non nel file jar viene eseguito?

+3

". Nota: I punti di intestazione di classe-percorso per classi o file JAR sulla rete locale, ** non JAR file all'interno del file JAR o alle classi accessibili attraverso i protocolli Internet ** Per caricare le classi in file JAR all'interno di un file JAR nel percorso della classe, è necessario scrivere codice personalizzato per caricare tali classi.Ad esempio, se MyJar.jar contiene un altro file JAR chiamato MyUtils.jar, non è possibile utilizzare l'intestazione Percorso di classe nel file manifest di MyJar.jar per caricare le classi in MyUtils. jar nel percorso di classe. " Fonte: https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html –

risposta

37

C'è un motivo per cui si sta evitando invocando la classe principale come

java -cp /usr/local/jar/foobar.jar:/some/other/path.jar com.your.main.classname 

?

Questo tipo di invocazione permette di mixare i percorsi assoluti con percorsi relativi. Metti questo in uno script di shell o in un file batch per evitare di dover effettivamente scrivere o ricordare il classpath completo per semplificare le cose.

+1

+1 per questo consiglio pratico! Oracle/SUN dovrebbe davvero deprecare l'opzione -jar ... è un incubo ricorrente ... –

+4

L'uso di '-jar' può essere notevolmente più semplice in alcuni scenari, ma se si trova che l'opzione semplificata ti dà problemi, allora sempre ha senso ricorrere all'opzione che ti dà il controllo totale –

34

È possibile creare una cartella, dicono lib, all'interno della cartella in cui si ha il file jar.

contenuti manifest.mf possono essere:

Main-Class: com.mastergaurav.test.app.MainClass 
Class-Path: lib/one.jar lib/two.jar 

contenuto della cartella:

mainFolder/ 
    * lib/one.jar 
    * lib/two.jar 
    * my-main.jar 

Per eseguire:

+2

btw, se si esegue java -cp/addtional/class/path -jar abcd.jar, il classpath addizionale non sarà ignorato. –

+3

Non hai assolutamente idea di quanto tempo ho cercato questo. Grazie. – Bogdan

+0

Ottima spiegazione! E, a proposito, non è supportato il carattere jolly, che tristezza .. –