2009-08-26 13 views
95

J'utilise actuellement l'assemblage jar-with-dependencies pour créer un tel pot. Cependant, le nom de mon pot est un peu long.Est-il possible de renommer un jar-avec-dépendances maven?

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

Y at-il de toute façon à faire cela sans copier fondamentalement le descripteur d'assemblage jar-with-dependencies et l'appeler plein?

En outre, je souhaite continuer à avoir le fichier jar sans le chemin de classe assemblé stocké dans le référentiel.

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

project-name-version-region-full.jar et project-name-version-region.jar doivent être stockés dans le référentiel. Dans le premier exemple, le classificateur est région-complet, dans la 2ème région c'est. Ce dernier travaille.

Répondre

168

Vous pouvez spécifier le finalName propriété pour donner le pot le nom que vous voulez, et préciser que appendAssemblyId doit être faux pour éviter le suffixe « pot-avec-dépendances ».

La configuration ci-dessous Affichera un pot 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, en utilisant le descripteur intégré ne fonctionnera pas. Je crois qu'il s'agit d'un bug dans les versions récentes de l'assembly-plugin - ils ont supprimé le support pour les classificateurs, mais l'identifiant est corrigé si vous utilisez un descripteur intégré, donc vous vous retrouvez avec un gros nom daft. Pour contourner le problème, vous pouvez copier le descripteur d'assembly utilisé par le descripteur jar-with-dependencies et modifier l'ID.

Cet exemple entraînerait l'ID d'assemblage étant ajouté à la finalName, donc si vous avez besoin d'avoir un nom de région full.jar, vous pouvez spécifier le finalName comme région et l'ID de montage comme plein. Cela entraînera un fichier dans la cible appelée region-full.jar, mais notez qu'il sera toujours installé dans le référentiel Maven en tant qu'artefact associé avec full utilisé comme classificateur. Tant que cet identifiant est différent de celui de votre autre assemblage, 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 pot-assembly.xml dans src/main/montage comme celui-ci:

<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> 
+1

Ah, appendAssemblyId, comment ai-tu me manques. Merci! –

+0

Travailler sur cette élaboration Rich. Essentiellement, j'ai besoin de deux artefacts de classificateur à stocker. Avec appendAssemblyId activé, j'avais 3 artifiacts, un sans classifieur, la version classifier et la version jar-with-dependencies. avec appendAssemblyID désactivé, le fichier uber est installé sur la version non classifieur. J'ai besoin que ces gars utilisent un classificateur basé sur la région + complet qui dit où ils ont été construits. Malheureusement, l'ajout de la balise classifier ne fonctionne pas. –

+0

Il suffit de définir * appendAssemblyId * à * false * pour effectuer le travail. Vous permet de conserver le nom final régulier sans le réécrire. –

2

Je vais donner le crédit riche pour moi pointant dans la bonne direction, mais je voulais poster la solution qui a fonctionné pour moi comme Rich était légèrement éteint:

Mon pot-assemblage.xml ressemblait à ce qui a permis l'identification de l'ensemble de changer pour la région qui a été stocké comme une 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 du plugin maven-ensemble ce construit mon projet avec mon nom de projet-nom-version-env-full.jar où env-full était le classificateur. Imaginez ma surprise quand j'ai appris que l'assemblage xml pouvait être paramétré par des éléments de la construction. C'était exactement ce que je cherchais.

8

Merci pour les messages ici et certains creuser dans le maven docs j'ai mis au point la configuration suivante pour un assemblage général jar exécutable unique réemballé avec un nom personnalisé.

En 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> 

En 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 reconditionné dans ce même pot et spécifié Main-Class: karlthepagain.MyMain.

+1

Cela a résolu tous mes problèmes en renommant principalement le dernier jar avec des dépendances. –

13

Je pense que j'ai 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 le nom final est spécifié avec l'artefact et la 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> 
+0

Vous avez parcouru un long chemin depuis votre première réponse, et cette réponse m'a encore aidé aujourd'hui si bien! ; D – vakio

+1

Je cherchais une solution comme la vôtre, sans un fichier jar-assembly.xml séparé. Merci ... Cela fonctionne parfaitement pour moi ... –

+0

Great! De rien :) – vikingsteve

2

Cela m'a travaillé pour

<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>