OVH Cloud OVH Cloud

Jar dans un jar

4 réponses
Avatar
takezo
Bonjour =E0 tous,

j'essaye (en vain) de faire l'op=E9ration (plut=F4t basique amha)
suivante :

j'ai un programme, sans package (je sais c'est pas bien ;-)), qui
utilise la librairie postgres. Mon application se d=E9coupe comme suit :


classes/*.class
classes/lib/pg73jdbc3.jar

mon Manifest :
Manifest-Version: 1.0
Main-Class: toto
Class-Path: lib/pg73jdbc3.jar

je cr=E9e mon jar en =E9tant dans le r=E9pertoire classes :
jar cmfv Manifest toto.jar *

Et l=E0, si j'essayes de lancer mon applic :

java -jar toto.jar
Class not found : org.postgresql.Driver
java.lang.NullPointerException
at TimeThread.run(TimeThread.java:24)

J'ai eu beau chercher un peu partout sur le net, j'ai vu un tas de gens
qui avaient le m=EAme probl=E8me que moi, mais personne qui r=E9soud
vraiment.

Je pourrais d=E9sarchiver le jar de postgres et le mettre dans mes
fichiers avant de faire le jar, mais je trouve cette solution assez
puante.


Any suggestion ?

4 réponses

Avatar
Rene Mouchot

Bonjour à tous,

j'essaye (en vain) de faire l'opération (plutôt basique amha)
suivante :

j'ai un programme, sans package (je sais c'est pas bien ;-)), qui
utilise la librairie postgres. Mon application se découpe comme suit :


classes/*.class
classes/lib/pg73jdbc3.jar

mon Manifest :
Manifest-Version: 1.0
Main-Class: toto
Class-Path: lib/pg73jdbc3.jar

je crée mon jar en étant dans le répertoire classes :
jar cmfv Manifest toto.jar *

Et là, si j'essayes de lancer mon applic :

java -jar toto.jar
Class not found : org.postgresql.Driver
java.lang.NullPointerException
at TimeThread.run(TimeThread.java:24)

J'ai eu beau chercher un peu partout sur le net, j'ai vu un tas de gens
qui avaient le même problème que moi, mais personne qui résoud
vraiment.

Je pourrais désarchiver le jar de postgres et le mettre dans mes
fichiers avant de faire le jar, mais je trouve cette solution assez
puante.


Any suggestion ?


Alors le souci, c'est que la solution puante est la bonne :)
Pour ton appli, il faut structurer comme suit :
- tonjar.jar, contenant un manifest qui indique la presence la lib
postgres dans un repertoire lib par exemple.
- lib/postgres.jar qui contient la librairie

Ouala,
--
Rene Mouchot

Avatar
Pierre Gilquin
pourquoi ne pas mettre les 2 jars independants dans ton classpath ?
java -classpath "tonAppli.jar;lib/pg73jdbc3.jar" Appli
Pierre


"takezo" wrote in message
news:
Bonjour à tous,

j'essaye (en vain) de faire l'opération (plutôt basique amha)
suivante :

j'ai un programme, sans package (je sais c'est pas bien ;-)), qui
utilise la librairie postgres. Mon application se découpe comme suit :


classes/*.class
classes/lib/pg73jdbc3.jar

mon Manifest :
Manifest-Version: 1.0
Main-Class: toto
Class-Path: lib/pg73jdbc3.jar

je crée mon jar en étant dans le répertoire classes :
jar cmfv Manifest toto.jar *

Et là, si j'essayes de lancer mon applic :

java -jar toto.jar
Class not found : org.postgresql.Driver
java.lang.NullPointerException
at TimeThread.run(TimeThread.java:24)

J'ai eu beau chercher un peu partout sur le net, j'ai vu un tas de gens
qui avaient le même problème que moi, mais personne qui résoud
vraiment.

Je pourrais désarchiver le jar de postgres et le mettre dans mes
fichiers avant de faire le jar, mais je trouve cette solution assez
puante.


Any suggestion ?

Avatar
flipouk
takezo wrote:
Je pourrais désarchiver le jar de postgres et le mettre dans mes
fichiers avant de faire le jar, mais je trouve cette solution assez
puante.


Extrait de :
http://java.sun.com/docs/books/tutorial/jar/manifest/downman.html

Je cite :
"The Class-Path header points to classes or JAR files on the local file
system, not JAR files within the JAR file or classes on the network. To
load classes in JAR files within a JAR file into the class path, you
must write custom code to load those classes. For example, if MyJar.jar
contains another JAR file called MyUtils.jar, you cannot use the
Class-Path header in MyJar.jar's manifest to load classes in MyUtils.jar
into the class path."

Traduction :
"Le descriptif Class-Path pointe vers des fichiers JAR sur le système de
fichiers local, pas sur des fichiers JAR situés dans le fichier JAR ou
sur le réseau. Pour inclure les classes d'un fichier JAR dans un fichier
JAR dans le classpath, vous devez écrire du code personnalisé. Par
exemple, si MyJar.jar contient un autre fichier JAR MyUtils.jar, vous ne
pouvez pas utiliser le descriptif Class-Path dans le manifest de
MyJar.jar pour ajouter les classes de MyUtils.jar au classpath."

Moi, ce qui m'intéresserait, c'est de savoir si quelqu'un a développé en
Open Source le code personnalisé mentionné ci-dessus (Netbeans, mon IDE,
ne le fait pas par exemple).

Pour l'instant, je fais comme ceci :
1. Dans le répertoire lib/ de mon appli (là où il y a les jar), je crée
un sous-répertoire 'exp' (pour 'expanded') dans lequel je dézippe les jar.
2. Comme je compile avec ant, j'utilise les lignes suivantes pour créer
mon jar :
---------------------------------------------------------------
<!-- TASK: JAR -->
<target name="jar" depends="compile">
<mkdir dir="${dist}"/>
<jar jarfile="${dist}/${jarname}" compress="true">
<fileset dir="${build}"/>
<fileset dir="${lib}/exp"/>
<manifest>
<attribute name="Main-Class" value="${main}"/>
<attribute name="Class-Path" value="${lib}"/>
</manifest>
</jar>
</target>
---------------------------------------------------------------

Pour ceux que cela intéresse, j'ai créé un programme pour
automatiquement dézipper les jar dans un sous répertoire 'exp'.

Si quelqu'un a une meilleure solution...

Sinon, il y a la solution déjà mentionnée par David, uberjar, à utiliser
avec maven. Mais bon je n'ai pas compris grand chose :
http://classworlds.codehaus.org/uberjar.html.

A+

F.

Avatar
flipouk
takezo wrote:
Any suggestion ?

J'ai aussi trouvé ce truc en googlant... Mais je n'ai pas de temps de

tester. Si tu l'essayes, donne nous ton retour d'expérience :

http://one-jar.sourceforge.net/

F.