web-dev-qa-db-fra.com

Créez plusieurs fichiers JAR exécutables (avec les dépendances incluses) à partir d'un seul projet Maven

J'ai un seul projet maven qui a plusieurs classes principales. Je veux générer des jars exécutables (qui incluent toutes les dépendances) à partir de ces projets. J'ai actuellement la configuration de construction suivante (en utilisant maven.Assembly):

<build>
<plugins>
    <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <configuration>
            <archive>
                <manifest>
                    <mainClass>classpath.to.my.mainClass</mainClass>
                </manifest>
            </archive>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
</plugins>
</build>

Est-ce un moyen d'y parvenir avec maven-assembly? Sinon, quelle est la façon la plus simple d'atteindre mon objectif?

27
Martin Thurau

Je n'ai pas pu résoudre ce problème avec le maven-Assembly-plugin d'une manière satisfaisante, j'ai donc opté pour une solution différente. J'ai utilisé le plugin onejar-maven :

<build>
  <plugins>
  <plugin>
    <groupId>org.dstovall</groupId>
    <artifactId>onejar-maven-plugin</artifactId>
    <version>1.4.4</version>
    <executions>
      <execution>
        <id>build-first</id>
          <configuration>
            <mainClass>classpath.to.first.Main</mainClass>
            <attachToBuild>true</attachToBuild>
            <classifier>onejar</classifier>
            <filename>first-runnable.jar</filename>
          </configuration>
          <goals>
            <goal>one-jar</goal>
          </goals>
        </execution>
      <execution>
        <id>build-second</id>
          <configuration>
            <mainClass>classpath.to.second.Main</mainClass>
            <attachToBuild>true</attachToBuild>
            <classifier>onejar</classifier>
            <filename>second-runnable.jar</filename>
          </configuration>
          <goals>
            <goal>one-jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

<pluginRepositories>
  <pluginRepository>
     <id>onejar-maven-plugin.googlecode.com</id>
     <url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
  </pluginRepository>
</pluginRepositories>
23
Martin Thurau

Tu peux le faire. Vous aurez besoin d'une exécution distincte pour chaque artefact que vous construisez (c'est-à-dire, donnez à chacun son propre identifiant mais vous pouvez laisser la phase par défaut), et vous devrez spécifier le nom final et archive/manifest/mainClass - pour chacun.

<build>
<plugins>
    <plugin>
        <artifactId>maven-Assembly-plugin</artifactId>
        <executions>
          <execution>
            <id>build-a</id>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>foobar.Aclass</mainClass>
                </manifest>
              </archive>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <finalName>foobar_a.jar</finalName>
            </configuration>
          </execution>
          <execution>
            <id>build-b</id>
            <configuration>
              <archive>
                <manifest>
                  <mainClass>foobar.Bclass</mainClass>
                </manifest>
              </archive>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <finalName>foobar_b.jar</finalName>
            </configuration>
          </execution>
        </executions>
    </plugin>
</plugins>
</build>
24
Donal Fellows

La meilleure réponse fonctionne si vous n'utilisez aucune configuration (ou aucune ressource, d'ailleurs) qui est intégrée dans votre fichier jar (par exemple, configuration des liaisons automatiques Spring Framework).

Heureusement, cette solution fonctionne également avec maven-shade-plugin et vous n'avez pas ce problème avec onejar-maven-plugin.

Aussi, maven-shade-plugin est activement maintenu par opposition à onejar-maven-plugin qui est dans le purgatoire qui est googlecode.

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-shade-plugin</artifactId>
  <version>2.4.1</version>
  <executions>
    <execution>
      <id>build-first</id>
      <phase>package</phase>
      <goals>
         <goal>shade</goal>
      </goals>   
      <configuration>
        <transformers>
          <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">                        
            <mainClass>classpath.to.first.Main</mainClass>
          </transformer>
        </transformers>
        <finalName>first-runnable</finalName>
      </configuration>        
    </execution>
    <execution>
      <id>build-second</id>
      <phase>package</phase>
      <goals>
         <goal>shade</goal>
      </goals>   
      <configuration>
        <transformers>
          <transformer implementation="org.Apache.maven.plugins.shade.resource.ManifestResourceTransformer">                        
            <mainClass>classpath.to.second.Main</mainClass>
          </transformer>
        </transformers>
        <finalName>second-runnable</finalName>
      </configuration>  
    </execution>
  </executions>
</plugin>
10
Dexter Legaspi

Pour spécifier une réponse un peu plus précédente qui m'a été très utile, vous devez ajouter le package de phase et l'assemblage d'objectif et exécuter le package mvn run clean, pom est le suivant:

<plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>build-a</id>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>firstMainClass</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <finalName>a.jar</finalName>
                    </configuration>
                    <phase>package</phase>
                    <goals>
                        <goal>Assembly</goal>
                    </goals>
                </execution>
                <execution>
                    <id>build-b</id>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>SecondMainClass</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <finalName>b.jar</finalName>
                    </configuration>
                    <phase>package</phase>
                    <goals>
                        <goal>Assembly</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
3
Legwann