IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Créer un jar exécutable avec ses dépendances


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut Créer un jar exécutable avec ses dépendances
    Bonjour,

    j'ai essayé d'utiliser un script Ant pour créer un jar exécutable et qui contient également l'ensemble des dépendances dont il a besoin.

    A noter que je développe avec Java 6.01

    L'archive se présente de la sorte :

    fr (package)
    -----> oneJarPerso (package)
    ----------->TestOneJarPerso.class


    lib (package)
    -----> commons-lang-2.3.jar
    -----> log4j-1.2.14.jar


    META-INF (package)
    -----> MANIFEST.MF


    Le fichier Manifest contient les lignes suivantes : «
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Manifest-Version: 1.0
    Ant-Version: Apache Ant 1.6.5
    Created-By: Foub
    Main-Class: fr.oneJarPerso.TestOneJarPerso
    Class-Path: . lib/commons-lang-2.3.jar lib/log4j-1.2.14.jar
    ».

    Si je lance le jar avec la commande « java - jar », j'obtiens une exception NoClassDefFoundError : «
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    java -jar monJAR.jar
    Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/la
    ng/StringUtils
            at fr.oneJarPerso.TestOneJarPerso.<init>(Unknown Source)
            at fr.oneJarPerso.TestOneJarPerso.main(Unknown Source)
    ».

    Avez-vous une idée qu'est-ce qui déconne ?

    Au niveau de la ligne « Class-Path », j'ai tout essayé :
    * Class-Path: ./lib/commons-lang-2.3.jar ./lib/log4j-1.2.14.jar
    * Class-Path: ./lib/*
    * Class-Path: lib\commons-lang-2.3.jar lib\log4j-1.2.14.jar
    * Class-Path: .\lib\commons-lang-2.3.jar .\lib\log4j-1.2.14.jar

    D'après vous, quel est la bonne écriture ?

    Je sais, je pourrais utiliser "Fat Jar" pour créer mon jar avec ses dépendances mais ce dernier ne marche pas si on utilise Java Web Start pour lancer l'appli.

    Merci de m'aider,
    F.

  2. #2
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Foub
    lib (package)
    -----> commons-lang-2.3.jar
    -----> log4j-1.2.14.jar
    Comment ça package? Tu veux dire répertoire?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    oui un répertoire...

    La classe TestOneJarPerso se trouve dans le répertoire fr.oneJarPerso.

    Les librairies commons-lang-2.3.jar et log4j-1.2.14.jar sont dans le répertoire lib.

    Enfin, le manifest se trouve bien dans le répertoire META-INF.

    F.

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Foub
    Avez-vous une idée qu'est-ce qui déconne ?
    La propriété Class-Path du Manifest référence des archives en dehors du Jar, et de manière relatif au répertoire contenant le jar. Il ne permet pas de référencé les fichiers à l'intérieur du jar...

    Citation Envoyé par Foub
    Au niveau de la ligne « Class-Path », j'ai tout essayé :
    * Class-Path: ./lib/commons-lang-2.3.jar ./lib/log4j-1.2.14.jar
    * Class-Path: ./lib/*
    * Class-Path: lib\commons-lang-2.3.jar lib\log4j-1.2.14.jar
    * Class-Path: .\lib\commons-lang-2.3.jar .\lib\log4j-1.2.14.jar

    D'après vous, quel est la bonne écriture ?
    La première ligne, bien que le ./ initial est inutile.
    La seconde ligne ne fonctionne pas (le * ne peut être utilisé qu'en ligne de commande si je ne me trompe pas), et les deux suivantes ne sont pas portable...

    Citation Envoyé par Foub
    Je sais, je pourrais utiliser "Fat Jar" pour créer mon jar avec ses dépendances mais ce dernier ne marche pas si on utilise Java Web Start pour lancer l'appli.
    Avec JWS il te suffit de déclarer les jar dans ton fichier *.jnlp...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    Merci pour ta réponse.

    L'attribut "Class-Path" du manifest référence des librairies en dehors du jar.

    Comment faire alors pour que les jars à l'intérieur d'une autre archive soit pris en compte dans le class-path ?

    Y-a-t-il une solution docteur ?

  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Foub
    Merci pour ta réponse.

    L'attribut "Class-Path" du manifest référence des librairies en dehors du jar.

    Comment faire alors pour que les jars à l'intérieur d'une autre archive soit pris en compte dans le class-path ?

    Y-a-t-il une solution docteur ?
    Non, si tu ne veux qu'une seule archive, tu es obligé d'extraire tout le contenu de ton jar que tu veux intégrer à ton autre jar, puis de l'intégrer à cet autre jar.

  7. #7
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Foub
    Comment faire alors pour que les jars à l'intérieur d'une autre archive soit pris en compte dans le class-path ?
    Soit tu utilises "FatJar" (qui décompresse tous les jar pour en faire une seule archive, si je ne me trompe pas), soit il faut que tu utilises un ClassLoader spécifique que tu lanceras au début de ton application (mais cela doit être un peu "chiant" à gérer).

    Mais dans le cas d'un déploiement via JWS je ne comprend pas trop l'intérêt de ne faire qu'un seul gros jar !?

    a++

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Points : 63
    Points
    63
    Par défaut
    Si j'utilise FatJar, j'arrive à lancer mon jar directement et ce dernier contient bien les librairies externes.

    Par contre, si j'utilise JWS, après l'avoir signé, voici mon fichier JNLP : «
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <?xml version="1.0" encoding="utf-8"?>
    <jnlp spec="1.0+" codebase="http://localhost/prog/" href="logiciel.jnlp">
     
    	<information>
    		<title>Mon Logiciel par JNLP</title>
    		<vendor>Foub</vendor>
    	</information>
     
    	<security>
    		<all-permissions />
    	</security>
     
    	<resources>
    		<j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/>
    		<jar href="http://localhost/prog/OneJarPerso_fat.jar" main="true" />
    	</resources>
     
    	<application-desc main-class="com.simontuffs.onejar.Boot" />
    </jnlp>
    ».

    Lors de l'exécution, une exception ClassNotFoundException est lancé...
    (cf. capture d'écran...)

    Comment faire avec JWS ?
    Y-a-t-il une solution propre ?

    Merci,
    F.
    Images attachées Images attachées  

  9. #9
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Foub
    Comment faire avec JWS ?
    Y-a-t-il une solution propre ?
    Il suffit de référencer tous les jar indépendamment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	<resources>
    		<j2se version="1.5+" href="http://java.sun.com/products/autodl/j2se"/>
    		<jar href="http://localhost/prog/OneJarPerso_fat.jar" main="true" />
    		<jar href="http://localhost/prog/jar1.jar" />
    		<jar href="http://localhost/prog/jar2.jar" />
    		<jar href="http://localhost/prog/jar3.jar" />
    		<jar href="http://localhost/prog/jar4.jar" />
    		<jar href="http://localhost/prog/jar5.jar" />
    	</resources>
    a++

Discussions similaires

  1. Créer un jar exécutable avec Eclipse
    Par rolls dans le forum Eclipse Java
    Réponses: 9
    Dernier message: 07/12/2009, 10h16
  2. Créer un fichier .jar exécutable avec Eclipse
    Par Bloodscalp dans le forum Eclipse Java
    Réponses: 21
    Dernier message: 22/05/2009, 23h22
  3. [Maven2]Jar executable avec ses librairies
    Par Shogun dans le forum Maven
    Réponses: 3
    Dernier message: 26/09/2007, 17h57
  4. Créer un JAR "agent" avec eclipse
    Par nicØB dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 14/08/2007, 17h49
  5. créer un jar exécutable avec option
    Par _Eric_ dans le forum Langage
    Réponses: 2
    Dernier message: 16/11/2006, 17h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo