OVH Cloud OVH Cloud

ant et merger un jar

12 réponses
Avatar
yvon.thoravalNO-SPAM
j'ai une appli qui utilise un jar "hsqldb.jar", mon build.xml permet de
fabriquer le jar de l'appli "macave.jar" mais j'aimerais savoir s'il
existe une commande qui permettrait d'inclure, par ant, tous les classes
de "hsqldb.jar" de manière à n'utiliser plus qu'un seul jar ???

--
yt

10 réponses

1 2
Avatar
Trognon Patrice
Yvon Thoraval wrote:

j'ai une appli qui utilise un jar "hsqldb.jar", mon build.xml permet de
fabriquer le jar de l'appli "macave.jar" mais j'aimerais savoir s'il
existe une commande qui permettrait d'inclure, par ant, tous les classes
de "hsqldb.jar" de manière à n'utiliser plus qu'un seul jar ???



Hi

Le principe est le suivant :

1) extraire ton jar hsqldb.jar dans un répertoire, ce repertoire
tu le gardes bien au chaud.

2) dans ton fichier build.xml, tu as ton entrée de compilation <javac ..../>
qui se trouve par exemple dans une target compile (<target name="compile"> ... </target>)

3) tu colles apres une target distrib qui va dependre de compile,
dans cette target distrib tu as une entrée <copy><fileset .../></copy>
pour copier les classes de ton jar a partir du répertoire ou elle se trouve
dans le repertoire ou tu généres tes classes a toi, c'est a dire dans le répertoire
ou tes classes son compilées par ta target compile.

4) tu as ensuite une entrée <jar .../> pour creer le jar qui va donc include
non seulement tes classes mais aussi celle du jar puisque tu les as copiées.

ca donne :
<target name="compile" depends="init"
description="compile sources " >
<!-- Compile the java code from ${src} into ${classes} -->
<javac
srcdir="${src}"
destdir="${classes}"
includes="com/javadevel/ptro/bogen/*.java,com/javadevel/ptro/bogen/sql/*.java,com/javadevel/ptro/bogen/beans/*.java,com/javadevel/ptro/bogen/xml/*.java"
classpath="/opt/j2sdk1.4.2_04/jre/lib/rt.jar:."
deprecation="yes"
/>
</target>

<target name="dist" depends="compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${dist}/lib"/>
<mkdir dir="${dist}/lib/datas"/>

<!-- ICI L'ENTREE COPY QUI COPY LES .class DU DRIVER MYSQL -->
<!-- ICI L'ENTREE COPY QUI COPY LES .class DU DRIVER MYSQL -->
<!-- ICI L'ENTREE COPY QUI COPY LES .class DU DRIVER MYSQL -->
<!-- ICI L'ENTREE COPY QUI COPY LES .class DU DRIVER MYSQL -->
<copy todir="${classes}/">
<fileset dir="${src}/libs/mysql/" includes="**"/>
</copy>

<copy todir="${classes}/">
<fileset dir="${src}" includes="*.gif"/>
</copy>



<!-- ICI L'ENTREE QUI CREE LE JAR -->
<!-- ICI L'ENTREE QUI CREE LE JAR -->
<!-- ICI L'ENTREE QUI CREE LE JAR -->
<!-- ICI L'ENTREE QUI CREE LE JAR -->
<!-- Put everything in ${classes} into the MyProject-${DSTAMP}.jar file -->
<jar
jarfile="${dist}/lib/bogen-${DSTAMP}.jar"
basedir="${classes}"
includes="*.gif,**/*.class"
manifest="./manifest"
/>

<copy todir="${dist}/lib/">
<fileset dir="${src}" includes="*.property"/>
</copy>
</target>

Cordialement,

Patrice
http://www.javadevel.com

Avatar
yvon.thoravalNO-SPAM
Trognon Patrice wrote:

Le principe est le suivant :

1) extraire ton jar hsqldb.jar dans un répertoire, ce repertoire
tu le gardes bien au chaud.

[...]


C'est le point essentiel, donc tu me confirmes que ant ne peut pas faire
un jar xf, curieux non ?

Merci beaucoup pour ta réponse précise °;)

--
yt

Avatar
Thomas Nguyen
On Sat, 02 Oct 2004 22:44:49 +0200, Yvon Thoraval wrote:

Trognon Patrice wrote:

Le principe est le suivant :

1) extraire ton jar hsqldb.jar dans un répertoire, ce repertoire
tu le gardes bien au chaud.

[...]


C'est le point essentiel, donc tu me confirmes que ant ne peut pas faire
un jar xf, curieux non ?


Si, bien sur que si, Ant est tout à fait capable de décompresser une
archive jar. C'est d'ailleurs la tache <unjar> qui fait ce boulot.


Avatar
yvon.thoravalNO-SPAM
Thomas Nguyen wrote:


Si, bien sur que si, Ant est tout à fait capable de décompresser une
archive jar. C'est d'ailleurs la tache <unjar> qui fait ce boulot.


Ah bon, alors pas de soucis, je peux tout faire avec ant...

Merci pour l'info °;)

--
yt

Avatar
Trognon Patrice
Yvon Thoraval wrote:

Thomas Nguyen wrote:


Si, bien sur que si, Ant est tout à fait capable de décompresser une
archive jar. C'est d'ailleurs la tache <unjar> qui fait ce boulot.


Ah bon, alors pas de soucis, je peux tout faire avec ant...

Merci pour l'info °;)



Hi

Oui bien sur, simplement j'ai extrait mon jar en dehors de ant
car je ne voulais pas le faire a chaque fois que je genere
ma distribution alors que c'est toujours le meme jar qu'il
faut extraire.

Voila

Patrice
http://www.javadevel.com


Avatar
yvon.thoravalNO-SPAM
Trognon Patrice wrote:

Oui bien sur, simplement j'ai extrait mon jar en dehors de ant
car je ne voulais pas le faire a chaque fois que je genere
ma distribution alors que c'est toujours le meme jar qu'il
faut extraire.


Ouais, ouais, j'ai un peu le même problème, en + des classes je met dans
mon jar :
**/*.properties
**/*.html
**/*.txt
**/*.gif
**/*.jpg
**/*.png

il faudrait que je mette au point un systeme avec paramètres du genre :

ant (sans param ne fait que compiler et rafraichi classes/)
ant html (ajoute les *.html ds classes)
etc...
ant all (refait à neuf le rép classes avant de compacter)...
--
yt

Avatar
Trognon Patrice
Yvon Thoraval wrote:

Trognon Patrice wrote:

Oui bien sur, simplement j'ai extrait mon jar en dehors de ant
car je ne voulais pas le faire a chaque fois que je genere
ma distribution alors que c'est toujours le meme jar qu'il
faut extraire.


Ouais, ouais, j'ai un peu le même problème, en + des classes je met dans
mon jar :
**/*.properties
**/*.html
**/*.txt
**/*.gif
**/*.jpg
**/*.png

il faudrait que je mette au point un systeme avec paramètres du genre :

ant (sans param ne fait que compiler et rafraichi classes/)
ant html (ajoute les *.html ds classes)
etc...
ant all (refait à neuf le rép classes avant de compacter)...


ben oui, tu créé differentes targets et ca va le faire.

Pat.


Avatar
Frédéric Lachasse
"Yvon Thoraval" wrote in message
news:1gl19cj.1m0g712ifbe3pN%
j'ai une appli qui utilise un jar "hsqldb.jar", mon build.xml permet de
fabriquer le jar de l'appli "macave.jar" mais j'aimerais savoir s'il
existe une commande qui permettrait d'inclure, par ant, tous les classes
de "hsqldb.jar" de manière à n'utiliser plus qu'un seul jar ???


Tu peux ajouter un <zipgroupfileset> dans ta tâche <jar> pour inclure le
contenu d'un jar (jar étant un zip) dans ton jar. Disponible avec ant 1.5+.

--
Frédéric Lachasse - ECP86

Avatar
yvon.thoravalNO-SPAM
Frédéric Lachasse wrote:


Tu peux ajouter un <zipgroupfileset> dans ta tâche <jar> pour inclure le
contenu d'un jar (jar étant un zip) dans ton jar. Disponible avec ant 1.5+.


Merci, c'est très intéressant, pour l'instant j'ai ça :

<jar jarfile="lib/${app}" basedir="${dst}">
<manifest>
<attribute name ="Main-Class"
value="yt.ui.MaCave"/>
<attribute name ="Class-Path"
value="lib/hsqldb.jar lib/macave.jar"/>
</manifest>
</jar>

Ton conseil ma donné l'idée de lire le manuel à la page :
<http://ant.apache.org/manual/CoreTypes/zipfileset.html>
qui dit :
Examples

<zip destfile="${dist}/manual.zip">
<zipfileset dir="htdocs/manual" prefix="docs/user-guide"/>
<zipfileset dir="." includes="ChangeLog27.txt"
fullpath="docs/ChangeLog.txt"/>
<zipfileset src="examples.zip" includes="**/*.html"
prefix="docs/examples"/>
</zip>

zips all files in the htdocs/manual directory into the
docs/user-guide directory in the archive, adds the file ChangeLog27.txt
in the current directory as docs/ChangeLog.txt, and includes all the
html files in examples.zip under docs/examples. The archive might end up
containing the files:
docs/user-guide/html/index.html
docs/ChangeLog.txt
docs/examples/index.html

Donc je peux changer ma task ant en qqc comme :
<jar jarfile="lib/${app}">
<manifest>
<attribute name ="Main-Class"
value="yt.ui.MaCave"/>
<attribute name ="Class-Path"
value="lib/macave.jar"/>
</manifest>
<zipfileset dir="classes/yt" prefix="yt"/>
<zipfileset dir="lib/hsqldb.jar" prefix="."/>
<!-- verifier le prefix /-->
</jar>
En tout cas merci pour ton info je vai faire qq essais asap...

--
yt

Avatar
Frédéric Lachasse
"Yvon Thoraval" wrote in message
news:1gl4do4.1om5i5y1htzkosN%
Frédéric Lachasse wrote:


Tu peux ajouter un <zipgroupfileset> dans ta tâche <jar> pour inclure le
contenu d'un jar (jar étant un zip) dans ton jar. Disponible avec ant
1.5+.


Merci, c'est très intéressant, pour l'instant j'ai ça :

<jar jarfile="lib/${app}" basedir="${dst}">
<manifest>
<attribute name ="Main-Class"
value="yt.ui.MaCave"/>
<attribute name ="Class-Path"
value="lib/hsqldb.jar lib/macave.jar"/>
</manifest>
</jar>

Ton conseil ma donné l'idée de lire le manuel à la page :
<http://ant.apache.org/manual/CoreTypes/zipfileset.html>
qui dit :
Examples

<zip destfile="${dist}/manual.zip">
<zipfileset dir="htdocs/manual" prefix="docs/user-guide"/>
<zipfileset dir="." includes="ChangeLog27.txt"
fullpath="docs/ChangeLog.txt"/>
<zipfileset src="examples.zip" includes="**/*.html"
prefix="docs/examples"/>
</zip>

zips all files in the htdocs/manual directory into the
docs/user-guide directory in the archive, adds the file ChangeLog27.txt
in the current directory as docs/ChangeLog.txt, and includes all the
html files in examples.zip under docs/examples. The archive might end up
containing the files:
docs/user-guide/html/index.html
docs/ChangeLog.txt
docs/examples/index.html

Donc je peux changer ma task ant en qqc comme :
<jar jarfile="lib/${app}">
<manifest>
<attribute name ="Main-Class"
value="yt.ui.MaCave"/>
<attribute name ="Class-Path"
value="lib/macave.jar"/>
</manifest>
<zipfileset dir="classes/yt" prefix="yt"/>
<zipfileset dir="lib/hsqldb.jar" prefix="."/>
<!-- verifier le prefix /-->
</jar>
En tout cas merci pour ton info je vai faire qq essais asap...


Pourquoi "Class-Path: lib/macave.jar" dans le manifest?

<zipfileset dir="lib/hsqldb.jar" prefix="."/>
Ce n'est probablement pas ce que tu veux faire: cela met hsqldb.jar dans ton
jar comme une resource, alors que tu veux inclure les classes de hsqldb.jar
dans ton jar.

Ce que tu veux est fait par <zipgroupfileset>.

Une autre possibilité est d'utiliser la library classworlds dans un uberjar.
Cela permet de packager une application former de plusieurs jars dans un
seul jar directement exécutable.

Voir http://classworlds.codehaus.org/uberjar.html

--
Frédéric Lachasse - ECP86


1 2