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

Maven Java Discussion :

Inclure tous les jars dans un jar


Sujet :

Maven Java

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut Inclure tous les jars dans un jar
    Bonjour,

    Actuellement, lorsque je package mon batch, tous les libs sont déplacés dans un répertoire lib (utilisation d'un assembly).

    En gros, à la fin de mon package, j'ai un tar.gz, contenant un répertoire lib (avec tous les jars), un répertoire conf.

    Ce que j'aimerai, c'est d'inclure toutes les lib dans un seul jar (il s'agit d'une demande de la prod).

    A la fin, j'aurai un tar.gz, avec un répertoire conf, et un répertoire lib contenant un seul jar.

    Est-ce possible et comment le réaliser. J'ai essayé d'utiliser le plugin maven-shade-plugin, mais ça fait pas trop ce que je veux.

    merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonsoir,

    Oui c'est tout à fait possible avec le maven assembly plugin. J'ai écrit un article sur mon site la dessus : http://www.romain-gervais.fr/article...-assembly.html Je te laisse lire l'article j'ai un peu la flemme de tout réécrire ^^. J'explique dans un premier temps comment faire un unique jar contenant toutes les dépendances de ton appli, puis comment faire un tar.gz et un zip de ton jar.

    La partie qui t’intéresse le plus est du descriptor jar.xml :

    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
    21
    22
    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
          <id>executable</id>
          <formats>
                <format>jar</format>
          </formats>
          <includeBaseDirectory>false</includeBaseDirectory>
          <dependencySets>
                <dependencySet>
                      <!-- décompresse les dépendances avant de les inclure dans le jar exécutable -->
                      <unpack>true</unpack>
                      <scope>runtime</scope>
                      <useProjectArtifact>false</useProjectArtifact>
                </dependencySet>
          </dependencySets>
          <fileSets>
                <fileSet>
                      <directory>${project.build.outputDirectory}</directory>
                      <outputDirectory></outputDirectory>
                </fileSet>
          </fileSets>
    </assembly>
    Bon courage.

    Romain.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Tu es un bon !

    Merci pour l'info, d'après ta description, c'est tout à fait ce que je souhaite faire.

    Demain, j'essaierai de mettre ça en place ;

    merci bien !

  4. #4
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Hello,

    Il y a également une autre façon de procéder sans passer par un assembly, c'est en utilisant le plugin shade, dont c'est justement le but :
    http://maven.apache.org/plugins/maven-shade-plugin/
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    On peut aussi faire une archive (tar.gz ou autre) avec le plugin maven-shade ? Car si ce n'est pas possible autant passer par le maven assembly pour faire le jar, et l'archive.

    Romain.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Romain,
    Je viens de tester ta méthode, ça marche comme le plugin shade.

    En fait, j'ai un jar contenant toutes les lib décompressé.

    Je ne veux pas qu'il soit décompressé.

    En gros, au lieu d'avoir 10000 jars dans un dossier lib, d'avoir un seul jar contenant tous les 10000 jars sans qu'ils soient décompressé.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Bonjour,

    J'avais mal compris ton problème. Je croyais que tu voulais un seul jar quelque soit son contenu du moment qu'il contienne les dépendances de ton appli. Fais exactement la même chose avec :

    Et ton jar contiendra tous les autres jar à l'intérieur.

    Romain.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    j'avais déjà essayé unpack à false, ça fonctionne pas.

    ça donne ça :

    j'ai mon tar.gz qui contient à la racine toutes les libs au lieu d'avoir à la racine un jar contenant toutes les libs.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Je viens de tester chez moi et j'ai réussi à faire ce que tu voulais, il doit donc y avoir un truc que je t'ai mal expliqué

    Il te faut deux assembly :

    - Un pour ton tar.gz :
    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
     
    <assembly      xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
          <id>tar-gz</id>
          <formats>
                <format>tar.gz</format>
          </formats>
          <includeBaseDirectory>false</includeBaseDirectory>
          <fileSets>
                <fileSet>
                      <directory>target</directory>
                      <includes>
                            <include>*-executable.jar</include>
                      </includes>
                      <outputDirectory>/</outputDirectory>
                </fileSet>
          </fileSets>
    </assembly>
    - Un assembly pour ton jar :
    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
    21
    22
    23
     
    <?xml version="1.0" encoding="UTF-8"?>
    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
      <id>executable</id>
      <formats>
        <format>jar</format>
      </formats>
      <includeBaseDirectory>false</includeBaseDirectory>
      <dependencySets>
        <dependencySet>
          <unpack>false</unpack>
          <scope>runtime</scope>
          <useProjectArtifact>false</useProjectArtifact>
        </dependencySet>
      </dependencySets>
      <fileSets>
        <fileSet>
          <directory>${project.build.outputDirectory}</directory>
          <outputDirectory></outputDirectory>
        </fileSet>
      </fileSets>
    </assembly>
    Et le pom :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    ...
     
    <build>
        <plugins>
          <plugin>
            <!-- NOTE: We don't need a groupId specification because the group is org.apache.maven.plugins ...which is assumed by default. -->
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.3</version><!--$NO-MVN-MAN-VER$ -->
            <executions>
              <execution>
                <id>creer-jar-executable</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
                <configuration>
                  <descriptors>
                    <descriptor>src/main/assembly/jar.xml</descriptor>
                  </descriptors>
                  <archive>
                    <manifest>
                      <mainClass>fr.monappli.MonMain</mainClass>
                    </manifest>
                  </archive>
                </configuration>
              </execution>
              <execution>
                <id>creer-tar-gz</id>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
                <configuration>
                  <descriptors>
                    <descriptor>src/main/assembly/tar-gz.xml</descriptor>
                  </descriptors>
                </configuration>
              </execution>
            </executions>
          </plugin>
        </plugins>
     
    ...
    Avec ce code, j'obtiens bien un tar.gz qui contient un jar, et ce jar qui contient tous les autres jar de mon appli.

    Si ça ne fonctionne pas montre nous ton POM et tes assembly.

    Romain.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    c'est bon .

    ça fonctionne !!! merci !

    il me reste plus qu'à faire quelques modifications pour prendre en compte certaines petites choses, mais sinon, j'obtiens bien ce que je voulais.

    merci beaucoup !

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Par contre, là en exécutant mon jar, j'obtiens cette erreur :

    Exception in thread "main" java.lang.NoClassDefFoundError: org.apache.commons.logging.LogFactory
    at com.xxx.xxx.MainClass.<clinit>(xxx.java:23)
    at java.lang.J9VMInternals.initializeImpl(Native Method)
    at java.lang.J9VMInternals.initialize(J9VMInternals.java:198)

    J'ai bien mon jar executable contenant toutes les libs.

    J'ai bien le logfactory dans mon executable.

    As tu une idée ?

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    D'après ce que j'ai lu sur le net c'est le maven assembly plugin qui remplit mal le manifest (http://jira.codehaus.org/browse/MASSEMBLY-334), et du coup tu ne peux pas l'exécuter dans l'état...

    Je n'ai pas trouvé de solution à ton soucis, désolé. Il faut va sûrement falloir faire une bidouille...

    J'ai remarqué que dans le jar de base produit par maven (celui qui n'est pas exécutable) que le manifest était bien rempli. Tu peux probablement faire un script sh qui décompresse tes deux jars, prends le manifest bien renseigné dans un jar, et le copie dans l'autre, puis repackage le jar. Tu peux ensuite ajouter ton script sh à la build maven. Mais c'est très très très moche...

    Sur Internet certaines personnes disent qu'elles ont passées par le maven war plugin ou le maven jar plugin pour remplir le manifest (mais je ne sais pas si tu peux packager le jar comme tu le souhaites avec le maven jar plugin), mais j'ai jamais essayé tout ça...

    Bon courage.

    Romain.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Finalement, je vais utiliser le plugin shade de maven.
    La prod vient de me confirmer qu'ils attendent un jar avec toutes les classes à l'intérieur. (ils s'en foutent d'avoir tous les .jar à l'intérieur du jar commun).

    En tout cas, merci pour ton aide

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 394
    Par défaut
    Au cas où tu souhaites rester sur le maven assembly, tu as juste à passer le unpack à true et là ça fonctionnera (c'est comme ça que je fonctionne actuellement). Mais ça doit tout à fait fonctionner avec le maven shade, je n'ai juste jamais utilisé ce plugin donc je ne peux pas t'aider dessus.

    Romain.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    merci pour l'info, j'ai testé avec le shade, le résultat est le même qu'avec le unpack à true.

    merci beaucoup en tout cas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclure les classes d'un jar dans un war
    Par Krishtov dans le forum Maven
    Réponses: 7
    Dernier message: 09/02/2012, 15h19
  2. [NetBeans] Inclure des package externes dans mon jar
    Par JavaEli dans le forum NetBeans
    Réponses: 4
    Dernier message: 13/03/2011, 20h34
  3. Réponses: 7
    Dernier message: 03/05/2007, 15h58
  4. Réponses: 3
    Dernier message: 19/12/2006, 01h38
  5. inclure un jar dans un jar
    Par arasium dans le forum Langage
    Réponses: 7
    Dernier message: 31/07/2006, 10h08

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