Eseguire un file JAR dalla riga di comando e specificare classpath


115

Ho compilato un file JAR e specificato la Main-Class nel manifest (ho usato la funzione di esportazione Eclipse ). Le mie dipendenze sono tutte in una directory etichettata lib. Non riesco a ottenere una risposta diretta su come eseguire il mio file JAR mentre specifichi che dovrebbe utilizzare lib/*come classpath.

Ho provato:

]$ java -jar -cp .:lib/* MyJar.jar
]$ java -cp .:lib/* -jar MyJar.jar
]$ java -cp .:lib/* com.somepackage.subpackage.Main

eccetera...

Ognuno dà un errore dicendo:

Error: Could not find or load main class ....

o dà l' NoClassDefFoundErrorindicazione che le biblioteche non sono state trovate.

Ho anche provato a rifare il file JAR e ho incluso la libdirectory e il contenuto, ma ancora nessun dado ...

Come posso eseguire un file JAR dalla riga di comando e specificare il classpath da utilizzare?


Risposte:


204

Quando si specifica, -jaril -cpparametro verrà ignorato.

Dalla documentazione :

Quando si utilizza questa opzione, il file JAR è l'origine di tutte le classi utente e le altre impostazioni del percorso classe utente vengono ignorate.

Inoltre non puoi "includere" i file jar necessari in un altro file jar (dovrai estrarne il contenuto e inserire i file .class nel tuo file jar)

Hai due opzioni:

  1. includi tutti i file jar dalla libdirectory nel manifest (puoi usare i percorsi relativi lì)
  2. Specifica tutto ( incluso il tuo jar) sulla riga di comando usando -cp:
    java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

22
; invece di: se usi Windows come segue java -cp MyJar.jar; lib / * com.somepackage.subpackage.Main
Errore

Inoltre, non è possibile "includere" i file jar necessari in un altro file jar. Certo che puoi. Se è per uso interno (cioè, ti aspetti che l'utente abbia qualche abilità tecnica, ecc.) Puoi semplicemente chiedere che il passaggio 1, prima di tentare di eseguire il jar, è di eseguire unzip MyJar.jar lib/*.jar. Quindi, come suggerisci, possono correrejava -cp MyJar.jar:lib/* ...
Roger

3
il problema è che è un caso d'uso comune eseguire un uber jar "tutto compreso" con un riferimento a un file delle proprietà specifico del server esterno. Ovviamente non è un blocker, ma sicuramente un comando meno prolisso se si potesse usare -jar e non dover specificare il main
Andrew Norman

Mi ci è voluto un po 'per capirlo. E ci vogliono circa 6 righe per caricare esplicitamente un file log4j. Un altro bug di Java che non verrà mai risolto.
Tuntable

1
Si noti che il percorso classe manifesst può essere utilizzato solo per caricare file jar. Non può essere utilizzato per cercare log4j3.xml, ad esempio. Mi ha fatto bene.
Sintonizzabile

34

Esegui un file jar e specifica un percorso di classe come questo:

java -cp <jar_name.jar:libs/*> com.test.App

jar_name.jar è il nome completo del JAR che desideri eseguire

libs/* è un percorso per i tuoi JAR di dipendenza

com.test.Appè il nome completo della classe dal JAR che ha il main(String[])metodo

Il jar e il jar dipendente dovrebbero avere i permessi di esecuzione.


10

Puoi farlo nella shell di unix:

java -cp MyJar.jar:lib/* com.somepackage.subpackage.Main

Puoi farlo in Windows PowerShell:

java -cp "MyJar.jar;lib\*" com.somepackage.subpackage.Main

4

In alternativa, usa il manifest per specificare il percorso della classe e la classe principale, se lo desideri, quindi non è necessario utilizzare -cpo specificare la classe principale. Nel tuo caso conterrebbe righe come questa:

Main-Class: com.test.App
Class-Path: lib/one.jar lib/two.jar

Sfortunatamente è necessario compitare ogni jar nel manifest (non è un grosso problema come fai solo una volta, e puoi usare uno script per costruire il file o usare uno strumento di build come ANT o Maven o Gradle). E il riferimento deve essere una directory relativa o assoluta a cui si esegue il filejava -jar MyJar.jar .

Quindi eseguilo con

java -jar MyJar.jar

Penso che il Class-Path debba fare riferimento ai file all'interno del jar esterno. Non sono riuscito a farlo funzionare in generale, per fare riferimento a file di configurazione al di fuori di MyJar.jar.
Tuntable

0

Puoi eseguire un Runtime.getRuntime.exec (comando) per riavviare il jar includendo il classpath con args.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.