J'essaie d'avoir un Projet B dérouler (et décompresser) un Zip construit par Projet A et déployé dans un référentiel distant.
Le Zip est créé et attaché en utilisant le maven-Assembly-plugin
, Avec le type d'emballage pom
:
<artifactId>project-a</artifactId>
<name>Zip</name>
<description>Used by Project B</description>
<packaging>pom</packaging>
...
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<executions>
<execution>
<id>distribution-package</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptors>
<descriptor>src/main/Assembly/scripts.xml</descriptor>
</descriptors>
<tarLongFileMode>gnu</tarLongFileMode>
</configuration>
</execution>
</executions>
</plugin>
Tenter de le retirer du pom de Projet B avec le maven-dependency-plugin
:
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-scripts</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/staging</outputDirectory>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<overWrite>true</overWrite>
<type>Zip</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
échoue avec: [ERROR] Failed to execute goal on project ...: Could not resolve dependencies for project group:artifact:pom:version: Could not find artifact group:project-a:Zip:version in nexus (http://...:8081/nexus/content/groups/public) -> [Help 1]
Je suppose que c'est parce que j'ai spécifié Projet A le packaging de pom
et non Zip
, mais je ne peux pas spécifier Projet A = comme type d'emballage Zip
car il en résulte:
[ERROR] Unknown packaging: Zip @ line 13, column 13
Suis-je en train de faire quelque chose de mal ici ou est-ce simplement impossible? J'ai juste un tas de fichiers que je veux regrouper dans un artefact et permettre à plusieurs autres projets de les télécharger et de les décompresser pour les utiliser. Ouvert à différentes suggestions ...
J'ai également vérifié que le Zip assemblé est bien dans le nexus.
MISE À JOUR AVEC RÉPONSE
Pour le bénéfice de quelqu'un d'autre, ce qui me manquait, c'est que le <classifier>
De la dépendance doit correspondre au <id>
De l'Assemblée. Notez où thisistheattachedartifactsclassifier
est spécifié dans les fichiers suivants.
scripts.xml (projet A):
<Assembly>
<id>thisistheattachedartifactsclassifier</id>
<formats>
<format>Zip</format>
</formats>
<fileSets>
<fileSet>
<directory>src/main/resources</directory>
...
</fileSet>
</fileSets>
</Assembly>
pom.xml (projet B):
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-scripts</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/staging</outputDirectory>
<stripVersion>true</stripVersion>
<artifactItems>
<artifactItem>
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<classifier>thisistheattachedartifactsclassifier</classifier>
<overWrite>true</overWrite>
<type>Zip</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
Bienvenue dans Stack Overflow :).
Tu es sur le bon chemin. Votre vrai problème est d'utiliser un Zip.
La configuration suivante est correcte et fonctionne très bien pour moi. C'est un ancien (il y a 2 ans), et je ne suis pas sûr que cela corresponde aux meilleures pratiques. Mais je sais que ça marche.
Cela me permet de partager certaines ressources entre projets, notamment pour les tests unitaires.
pom.xml
<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>1.1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-Assembly-plugin</artifactId>
<executions>
<execution>
<id>cfg-main-resources</id>
<goals>
<goal>single</goal>
</goals>
<phase>package</phase>
<configuration>
<descriptors>
<descriptor>/src/main/Assembly/resources.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
Descripteur d'assembly: Il produira cet artefact: cfg_dev-1.1.0-resources.Zip Veuillez noter que
le "classificateur" est des ressources (comme le nom de l'assembly)
ressources Zip false src/main/resources
pom.xml
Veuillez noter que
le "classificateur" de dépendance est des ressources (comme le nom de l'assembly précédent)
<!-- Unit test dependency -->
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>cfg_dev</artifactId>
<version>${project.version}</version>
<classifier>resources</classifier>
<type>Zip</type>
<scope>test</scope>
</dependency>
....
<build>
<testResources>
<!-- Ressources habituelles -->
<testResource>
<directory>src/test/resources</directory>
<filtering>true</filtering>
</testResource>
<!-- Unzipped resources from cfg_dev -->
<testResource>
<directory>${project.build.directory}/test-resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
<plugins>
<!-- Unzip shared resources -->
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-cfg-test-resources</id>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<phase>generate-test-resources</phase>
<configuration>
<outputDirectory>${project.build.directory}/test-resources</outputDirectory>
<includeArtifactIds>cfg_dev</includeArtifactIds>
<includeGroupIds>${project.groupId}</includeGroupIds>
<excludeTransitive>true</excludeTransitive>
<excludeTypes>pom</excludeTypes>
<scope>test</scope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
J'espère que c'est clair et que cela vous aidera :)
Une autre approche pourrait consister à abandonner complètement la fermeture à glissière, à utiliser le cycle de vie Maven standard pour emballer vos fichiers en tant que ressources dans un fichier jar et à y accéder à partir de vos autres projets via classpath.
Sauf si vous avez des exigences d'emballage spécifiques (y compris, excluant, etc.), cela ne nécessitera aucune configuration supplémentaire: placez simplement vos éléments dans le src/main/resources
répertoire.
Cette approche présente l'avantage supplémentaire de fonctionner sans changement lorsqu'elle est invoquée depuis un IDE tel qu'Eclipse.
Si jamais vous voulez faire quelque chose comme ça à partir de la ligne de commande (par exemple à partir d'un script sans avoir à écrire un pom.xml
fichier), voici comment procéder ...
Vous pouvez soit spécifier les propriétés individuelles:
mvn dependency:copy -DgroupId=org.Apache.maven -DartifactId=maven-core -Dversion=2.2.1 -Dpackaging=Zip -Dclassifier=thisistheattachedartifactsclassifier
Ou spécifiez-les tous dans un paramètre artifact
:
mvn dependency:copy -Dartifact=org.Apache.maven:maven-core:2.2.1:Zip:thisistheattachedartifactsclassifier
Avec ce dernier, il est important de conserver le classifier
à la fin, après le packaging/type
attribut. Comme ça: -Dartifact=groupId:artifactId:version:type:classifier
Vous pouvez également éventuellement spécifier le répertoire cible à l'aide de -DoutputDirectory=<directory>
paramètre si nécessaire.