web-dev-qa-db-fra.com

Maven - Dépend du zip assemblé

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

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.

Projet Zip:

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

  1. c'est une archive Zip
  2. le "classificateur" est des ressources (comme le nom de l'assembly)

    ressources Zip false src/main/resources

Projet principal:

pom.xml

Veuillez noter que

  1. cela dépend d'une archive Zip
  2. 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 :)

33
Jean-Rémy Revy

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.

4
Nicola Musatti

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.

0
nwinkler