web-dev-qa-db-fra.com

Est-il possible de renommer un maven jar-with-dependencies?

J'utilise actuellement l'assemblage jar-with-dependencies pour créer un tel jar. Cependant, le nom de mon pot est un peu long.

Étant donné que ce programme est utilisé par les programmes RPG sur un AS400, j'aimerais le raccourcir pour simplifier un peu la vie de ces développeurs. Mais, à part à la main, je n'ai pas trouvé le moyen de renommer le pot comme d'habitude project-name-version-classifier-jar-with-dependencies.jar. Je voudrais quelque chose comme project-name-version-classifier-full.jar

Est-il possible de le faire sans copier fondamentalement le descripteur Assembly de jar-with-dependencies et l'appeler comme étant plein?

De plus, je veux continuer à avoir le fichier jar sans le classpath assemblé dans le référentiel.

J'ai besoin de deux artefacts. Le pot contenant mon classificateur contenant la région à laquelle la construction est destinée. Le pot avec toutes les dépendances qui inclut également la région.

project-name-version-region-full.jar et project-name-version-region.jar devrait être stocké dans le référentiel. Dans le premier exemple, le classificateur est plein de régions, dans le second c'est la région. Ce dernier fonctionne.

121
Mike Cornell

Vous pouvez spécifier la propriété finalName pour attribuer le nom souhaité au fichier jar, puis spécifier que appendAssemblyId doit être false pour éviter le suffixe "jar-with-dependencies".

La configuration ci-dessous générera un fichier jar appelé "test.jar"

<plugin>
  <artifactId>maven-Assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>test</finalName>
        <appendAssemblyId>false</appendAssemblyId>
      </configuration>
    </execution>
  </executions>
</plugin>

Mise à jour: en fonction de vos commentaires, l'utilisation du descripteur intégré ne fonctionnera pas. Je pense qu’il s’agit d’un bogue dans les versions récentes du plug-in Assembly: ils ont supprimé la prise en charge des classificateurs, mais l’id est corrigé si vous utilisez un descripteur intégré, vous obtenez donc un nom de grande taille.

Pour résoudre ce problème, vous pouvez copier le descripteur d'assemblage utilisé par le descripteur jar-with-dependencies et modifier l'id.

Cet exemple aboutirait à l'ajout de l'ID d'assembly à finalName. Par conséquent, si vous avez besoin d'un nom region-full.jar , vous pouvez spécifier le nom final en tant que région et l'ID d'assemblage en tant que complet . Cela aboutira à un fichier dans la cible appelé region-full.jar, mais notez qu'il sera toujours installé dans le référentiel Maven sous la forme d'un artefact attaché avec complet utilisé comme classificateur. Tant que cet identifiant est différent de celui de votre autre assemblée, il ne devrait pas y avoir de collision.

La configuration de pom ressemblerait à ceci.

<plugin>
  <artifactId>maven-Assembly-plugin</artifactId>
  <version>2.2-beta-4</version>
  <executions>
    <execution>
      <id>jar-with-dependencies</id>
      <phase>prepare-package</phase>
      <goals>
        <goal>single</goal>
      </goals>
      <configuration>
        <descriptors>
          <descriptor>src/main/Assembly/jar-Assembly.xml</descriptor>
        </descriptors>
        <finalName>region</finalName>
      </configuration>
    </execution>
  </executions>
</plugin>

et le jar-Assembly.xml dans src/main/Assembly comme ceci:

<Assembly>
  <id>full</id>
  <formats>
    <format>jar</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <dependencySets>
    <dependencySet>
      <unpack>true</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
  <fileSets>
    <fileSet>
      <directory>${project.build.outputDirectory}</directory>
    </fileSet>
  </fileSets>
</Assembly>
211
Rich Seller

Je pense avoir trouvé un moyen de configurer cela directement dans le pom sans avoir besoin d'un fichier jar-Assembly.xml séparé.

C'est fondamentalement la même chose que la réponse de Rich, sauf que finalName est spécifié avec artifactId et version.

<plugin>
    <artifactId>maven-Assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <finalName>${project.artifactId}-${project.version}-full</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <archive>
            <manifest>
                <mainClass>com.mycompany.MyMainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-my-jar-with-dependenciess</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>
27
vikingsteve

Grâce aux messages ici et à quelques recherches dans la maven docs , je suis parvenu à la configuration suivante pour un assemblage de jar exécutable unique remballé avec un nom personnalisé.

Dans pom.xml:

<plugin>
    <artifactId>maven-Assembly-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>exe</id>
            <phase>package</phase>
            <goals><goal>single</goal></goals>
            <configuration>
                <finalName>MyJarName</finalName>
                <attach>false</attach>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptors>
                    <descriptor>Assembly.xml</descriptor>
                </descriptors>
                <archive>
                    <manifest>
                        <mainClass>karlthepagain.MyMain</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

Dans Assembly.xml:

<Assembly>
    <id>exe</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
</Assembly>

Cela produira MyJarName.jar Avec toutes ses dépendances réemballées dans ce même fichier jar et le Main-Class: karlthepagain.MyMain Spécifié.

8
Karl the Pagan

Je vais donner le crédit à Rich pour m'avoir orienté dans la bonne direction, mais je voulais poster la solution qui fonctionnait pour moi, car celle de Rich était légèrement différente:

Mon jar-Assembly.xml ressemblait à ceci, ce qui permettait à l'identifiant d'assembly de changer pour la région qui était stockée en tant que propriété dans mon profil:

<Assembly>
  <id>${env}-full</id>
    <formats>
      <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
      <dependencySet>
        <unpack>true</unpack>
        <scope>runtime</scope>
      </dependencySet>
    </dependencySets>
    <fileSets>
      <fileSet>
        <directory>${project.build.outputDirectory}</directory>
      </fileSet>
    </fileSets>
</Assembly>

Je n'ai pas utilisé le paramètre finalName dans les paramètres de maven-Assembly-plugin, car celui-ci a construit mon projet avec mon nom nom-projet-version-env-full.jar, où env-full était le classificateur.

Imaginez ma surprise lorsque j’ai appris que l’Assembly xml pouvait être paramétré par les éléments de la construction. C'était exactement ce que je cherchais.

3
Mike Cornell

Cela a fonctionné pour moi

<build>
    <finalName>anynameyoulike</finalName>
    <plugins>           
        <plugin>
            <artifactId>maven-Assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>                   
                <appendAssemblyId>false</appendAssemblyId>
                <archive>
                    <manifest>
                        <mainClass>com.mycompany.MyMainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
            <executions>
                <execution>
                    <id>make-Assembly</id> <!-- this is used for inheritance merges -->
                    <phase>package</phase> <!-- bind to the packaging phase -->
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
2
umesh9883

Il est également possible de remplacer le fichier JAR original en utilisant ${project.build.finalName} comme nom final:

<plugin>
  <artifactId>maven-Assembly-plugin</artifactId>
   <executions>
      <execution>
          <phase>package</phase>
          <goals>
             <goal>single</goal>
          </goals>
      </execution>
   </executions>
   <configuration>
     <descriptorRefs>
       <descriptorRef>jar-with-dependencies</descriptorRef>
     </descriptorRefs>
     <finalName>${project.build.finalName}</finalName>
     <appendAssemblyId>false</appendAssemblyId>
   </configuration>
 </plugin>
0
Mark Schäfer