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.