2010-02-15 9 views
6

Est-il possible de créer un fichier JAR qui nécessite des dépendances externes sans inclure ces dépendances dans le fichier JAR?Créer un fichier JAR sans inclure les dépendances externes

Mon google-fu n'a pas réussi à me donner une réponse; tout ce que j'ai trouvé montre comment les inclure dans le fichier JAR, mais pas ce qu'il faut mettre dans le fichier manifeste pour dire "je ne les ai pas, regardez dans le classpath de l'utilisateur". Je suppose que les dépendances sont correctement installées et configurées sur le classpath de l'utilisateur.

Dans mon cas, mes dépendances sont Apache Commons CLI et Math.


Edit: Dans mon fichier JAR, je Main.class.

Mon fichier manifeste ressemble:

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

Mon CLASSPATH ressemble

.;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 

Si j'inclure les dépendances du JAR dans /lib et ajoutez la ligne Class-Path: lib/commons-math-2.0.jar lib/commons-cli-1.2.jar au manifeste, il ne travail.

J'ai essayé d'ajouter Class-Path: commons-math-2.0.jar commons-cli-1.2.jar au manifeste sans inclure les fichiers dans le fichier JAR pour voir si cela fonctionnerait, mais ce n'est pas le cas.

Répondre

3

Utilisez l'entrée Class-Path dans le META-INF/MANIFEST.MF pour indiquer où chercher les dépendances relatives à votre JAR. Par exemple:

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

mais je ne sais pas où ils sont, sauf qu'ils existent dans le classpath de l'ordinateur de l'utilisateur. – masher

+0

@masher Combinez tout dans un zip afin de contrôler l'emplacement. Sinon, ce n'est pas pour vous. Mieux vaut juste demander à l'utilisateur de définir son chemin de classe manuellement dans ce cas. –

+0

@masher: Si vous ne savez pas où ils se trouvent, vous ne devriez pas les lister du tout mais documenter que l'utilisateur doit les mettre dans le classpath à côté de votre pot. – Fredrik

3

C'est certainement possible. Une façon d'y penser est que chaque fois que vous créez un pot, vous dépendez des classes dans le jre, et il n'est pas nécessaire de les inclure dans votre pot. Le jre les recherchera automatiquement dans le classpath. Si elles ne sont pas trouvées, vous verrez un NoClassDefFoundError.

+2

+1. Comme le dit akf, vous ne devriez rien faire, tant que le classpath de l'utilisateur est correct. Mettre des entrées dans le manifeste est juste un moyen d'ajouter au classpath. –

+0

Je peux voir que je ne devrais rien faire, c'est juste que je ne peux pas le faire fonctionner! Eh bien, dans ce cas particulier, ce n'est que ~ 130 ko supplémentaires, donc je peux vivre avec les bibliothèques incluses dans le JAR ... – masher

+0

et vous identifiez vos dépendances sur la ligne de commande java dans le classpath? – akf

Questions connexes