J'ai un projet Maven multi-module et dans un module, je veux créer deux artefacts pendant la construction:
Voici le code que j'utilise pour configurer le maven-Assembly-plugin
brancher:
<plugin>
<artifactId>
maven-Assembly-plugin
</artifactId>
<version>2.4</version>
<executions>
<execution>
<id>dist-Assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<finalName>bso</finalName>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<finalName>helper-${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>HelperMain<mainClass>
</manifest>
</archive>
</configuration>
</execution>
</executions>
</plugin>
Je configure appendAssemblyId
sur false
car sinon -jar-with-dependencies
sera ajouté au nom définitif et je n'en vois pas la nécessité. L'omission donne un nom de fichier plus propre et plus facile à utiliser.
Quand je lance mvn integration-test
puis je reçois les avertissements suivants:
[AVERTISSEMENT] Options de configuration: 'appendAssemblyId' est défini sur false et 'classifier' est manquant. Au lieu de joindre le fichier d'assemblage: [...]/target/helper-5.0.0-SNAPSHOT.jar, il deviendra le fichier de l'artefact principal du projet.
REMARQUE: si plusieurs descripteurs ou formats de descripteurs sont fournis pour ce projet, la valeur de ce fichier ne sera pas déterministe!
[AVERTISSEMENT] Remplacement du fichier d'artefact principal du projet préexistant: [...]/target/my.module-5.0.0-SNAPSHOT.jar par le fichier d'assemblage: [...]/target/helper-5.0.0- SNAPSHOT.jar
Il y a deux choses qui m'irritent:
Malgré le fait que l'avertissement prétend qu'il remplacera my.module-5.0.0-SNAPSHOT.jar par helper-5.0.0-SNAPSHOT.jar, il ne le fait pas réellement et lorsque la génération est terminée, les deux fichiers ont toujours des tailles différentes.
Pourquoi l'avertissement concernant le remplacement de l'artefact apparaît-il du tout?
Il semble que classifier
soit obsolète pourquoi l'avertissement me demande-t-il de l'utiliser?
C'est parce que vous interprétez mal les avertissements.
Résumons. Un projet Maven qui n'est pas de type pom
produira toujours, par défaut, ce qu'on appelle un artefact principal. Pour un JAR, cet artefact est le résultat de l'empaquetage des sources compilées dans un JAR; pour une GUERRE, c'est le résultat de la construction de l'application web.
Ce qui est important à retenir est que cet artefact est attaché au projet: cette terminologie est utile lorsque le projet est installé (avec mvn install
), déployé (avec mvn deploy
) ou publié (avec maven-release-plugin
). Attaché signifie que cet artefact sera installé/déployé/publié lorsque le projet est. Tous les fichiers générés lors d'une génération Maven (en gros, tout ce qui se trouve sous le dossier target
) ne le sont pas; seuls les fichiers joints. En tant que tel, vous pouvez très bien créer de nombreux fichiers sous target
mais avoir un seul artefact installé.
Parallèlement à cet artefact principal, vous souhaiterez peut-être que votre génération produise d'autres artefacts à installer ou à déployer. C'est le concept d'artefacts attachés supplémentaires ou secondaires. Les principaux exemples sont le Javadoc ou les sources: généralement lorsqu'un projet est publié, son Javadoc et ses sources le sont également. Et c'est là que la notion classifier
entre en je .
Dans un référentiel Maven, chaque fichier doit suivre la même convention de dénomination: artifactId-version(-classifier).type
. Chaque artefact secondaire aura le même GAV (identifiant de groupe, id d'artefact, version) que l'artefact principal, donc si vous voulez mettre à l'intérieur d'un dépôt Maven 1 artefact principal et 1 artefact attaché (comme ce serait le cas pour un JAR principal le long avec ses sources JAR Javadoc et JAR), vous avez besoin d'un moyen de les distinguer. C'est à cela que sert le classifier
: distinguer les artefacts secondaires de l'artefact principal.
Revenons maintenant à votre exemple. Votre projet Maven, qui est d'un emballage jar
, produira par défaut un artefact JAR principal appelé my.module-5.0.0-SNAPSHOT.jar
; toujours par défaut, ce JAR principal est attaché au projet (et prêt à être installé/déployé). Vous configurez maintenant le maven-Assembly-plugin
Pour créer un nouvel artefact JAR (appelé helper-5.0.0-SNAPSHOT.jar
Mais cela n'a vraiment pas d'importance). Le plugin Assembly, par défaut, attache au projet l'artefact qu'il produit . Vous vous retrouvez donc avec 2 artefacts attachés
my.module
; le fait que le fichier sur le disque à l'intérieur du dossier target
soit nommé helper
pour l'un n'est pas pertinent, seules les coordonnées GAV comptent5.0.0-SNAPSHOT
et aucun classificateur pour les distinguer. C'est ce qui déclenche l'avertissement: vous finissez par attacher au projet un artefact secondaire qui remplace efficacement le principal, simplement parce qu'il a les mêmes coordonnées. Le résultat est donc:
target
, mais cela n'est pas pertinent carC'est celui produit par le plugin Assembly qui va gagner le conflit et remplacer l'artefact principal attaché.
Si vous voulez vous convaincre de tout cela, exécutez mvn clean install
Sur le projet et vérifiez votre dépôt local. Vous remarquerez que seul l'artefact jar-with-dependencies
Sera installé. L'autre (l'artefact principal) est allé pouf.
Vous pouvez également configurer un <distributionManagement>
:
<distributionManagement>
<repository>
<id>local-repo-test</id>
<url>file://...</url>
</repository>
</distributionManagement>
et appelez mvn clean deploy
. Vous pouvez ensuite vérifier que le seul artefact déployé sera le jar-with-dependencies
.
Remarque finale: Oui, le paramètre classifier
du plugin d'assemblage est déconseillé, car vous devez simplement utiliser l'ID d'assembly comme classificateur.