60 votes

Un moyen propre de combiner plusieurs bocaux ? De préférence en utilisant Ant

J'ai des dépendances d'exécution sur certains bocaux externes que j'aimerais regrouper en un seul bocal. Ces dépendances externes sont stockées dans un répertoire external_jars, et j'aimerais pouvoir ne pas avoir à les lister toutes (c'est-à-dire ne pas avoir à modifier mes scripts de construction si mes dépendances changent). Des idées ?

Google m'a donné une bonne réponse sur la façon de le faire - si cela ne vous dérange pas de lister chaque jar comme une dépendance :

http://markmail.org/message/zijbwm46maxzzoo5

En gros, je veux quelque chose du type de ce qui suit, qui combinerait toutes les jarres du répertoire lib dans out.jar (avec quelques règles d'écrasement raisonnables).

jar -combine -out out.jar -in lib/*.jar

66voto

nightingale Points 671

La réponse de Vladimir est correcte, mais j'ai l'impression que ce qu'il suggère implique de remballer tous les bocaux dans un seul gros out.jar, qui est ensuite envoyé à la tâche Ant Jar en tant que simple <zipfileset> ou quelque chose comme ça. Cette approche en deux étapes est inutile. Je ne sais pas si cela est lié à la version d'Ant, mais j'ai Ant 1.7.1, et ses <jar> la tâche comprend <zipgroupfileset> qui permet d'alimenter directement tout le contenu des pots de tiers.

<jar destfile="MyApplication.jar">
  <zipgroupfileset dir="lib" includes="*.jar" /> 
  <!-- other options -->
  <manifest>
    <attribute name="Main-Class" value="Main.MainClass" />
  </manifest>
</jar>

57voto

Vladimir Points 4511

Il suffit d'utiliser zipgroupfileset avec la fourmi Tâche zippée

<zip destfile="out.jar">
    <zipgroupfileset dir="lib" includes="*.jar"/>
</zip>

Cela aplatira le contenu de toutes les bibliothèques jar incluses.

23voto

Staale Points 8795

Vous pourriez vérifier JARJAR :

http://code.google.com/p/jarjar/

9voto

David Grant Points 8477

Essayez d'abord d'extraire vos JARs dans un répertoire de marshalling :

<target name="combine-jars">
    <mkdir dir="${marshall.dir}"/>
    <unzip dest="${marshall.dir}">
        <fileset dir="${external.jar.dir}">
            <include name="**/*.jar"/>
        </fileset>
    </unzip>
    <jar destfile="${combined.jar}" basedir="${marshall.dir"}>
    <delete dir="${marshall.dir}"/>
</target>

${marshall.dir} est un répertoire temporaire, ${external.jar.dir} est l'endroit où vous gardez les JAR's, et ${combined.jar} est le JAR cible.

3voto

Mozart Brocchini Points 219

Si vous utilisez maven, pourquoi ne le feriez-vous pas ? :) Utilisez simplement le plugin maven-shade, qui fonctionne comme un charme !

  <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.5</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.YOUR_COMPANY.YOUR_MAIN_CLASS</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X