2010-02-15 14 views
6

È possibile creare un file JAR che richiede dipendenze esterne senza includere tali dipendenze nel file JAR?Crea file JAR senza includere dipendenze esterne

Il mio google-fu non è riuscito a darmi una risposta; tutto ciò che ho trovato mostra come includerli nel file JAR, ma non cosa mettere nel file manifest per dire "Non li ho, guarda nel classpath dell'utente". Suppongo che le dipendenze siano installate e configurate correttamente sul classpath dell'utente.

Nel mio caso, le mie dipendenze sono Apache Commons CLI e Math.


Edit: Dentro la mia file JAR, ho Main.class.

mio file manifesto appare come:

Manifest-Version: 1.0 
Created-By: 1.6.0 (Sun Microsystems Inc.) 
Main-Class: Main 

mio CLASSPATH assomiglia

.;C:\Program Files\Java\jre1.6.0_06\lib\ext\QTJava.zip;C:\java_lib\commons-cli-1.2.jar;C:\java_lib\commons-math-2.0\commons-math-2.0.jar 

Se includo le dipendenze nel JAR in /lib e aggiungi la linea Class-Path: lib/commons-math-2.0.jar lib/commons-cli-1.2.jar al manifesto, poi lo fa lavoro.

Ho provato ad aggiungere Class-Path: commons-math-2.0.jar commons-cli-1.2.jar al manifest senza includere i file nel JAR solo per vedere se funzionasse, ma non lo ha fatto.

risposta

3

Utilizzare la voce Class-Path nello META-INF/MANIFEST.MF per indicare dove cercare le dipendenze relativamente al JAR. Ad esempio:

Class-Path: servlet.jar ../foo/bar.jar acme/beans.jar 
+0

ma non so dove sono, tranne che esistono nel classpath del computer dell'utente. – masher

+0

@masher Raggruppa tutto in una zip per avere il controllo della posizione. Altrimenti, questo non fa per te. Meglio chiedere all'utente di impostare manualmente il percorso della classe in quel caso. –

+0

@masher: se non sai dove sono, non dovresti elencarli ma documentare che l'utente deve metterli nel classpath accanto al tuo jar. – Fredrik

3

È certamente possibile. Un modo per pensarci è che ogni volta che crei un barattolo, sei dipendente dalle classi nel jre e non è necessario includerle nel tuo barattolo. Il jre li cercherà automaticamente nel classpath. Se non vengono trovati, vedrai uno NoClassDefFoundError.

+2

+1. Come dice akf, non dovresti fare nulla, a patto che il classpath dell'utente sia corretto. Inserire le voci nel manifest è solo un modo per aggiungere al classpath. –

+0

Posso vedere che non dovrei fare nulla, è solo che non riesco a farlo funzionare! Oh bene, in questo caso particolare, è solo un ulteriore ~ ​​130 kB, quindi posso vivere includendo le librerie nel JAR ... – masher

+0

e stai identificando le tue dipendenze sulla linea di comando java nel classpath? – akf

Problemi correlati