web-dev-qa-db-fra.com

Projet multi-module Maven - copie de tous les JARS "package" des sous-modules dans le parent / cible /

J'ai un projet maven avec pas mal de sous-modules. Ce que je recherche, c'est un moyen d'obtenir tous les fichiers .jar produits par les sous-modules inclus dans le répertoire/target/du POM d'agrégation, afin qu'ils puissent être facilement utilisés par la suite.

  • Ils n'ont pas besoin d'être fusionnés. De préférence non, mais si elles doivent être alors c'est ok.
  • Ne vous souciez pas des dépendances
  • C'est principalement pour des raisons de commodité, à ce stade

Une version de base de ce que je cherche à faire:

Prj1/pom.xml  =>  prj1/target/proj1.jar  (and classes/generated-sources/etc)
Prj2/pom.xml  =>  prj2/target/proj2.jar
Main/pom.xml  =>
                  main/target/proj1.jar
                  main/target/proj2.jar
                  ... classes/generated-sources not needed at all,
                  ... but they could be combined here.  I assume they will be

J'ai lu et utilisé quelques suggestions de SO également. Jusqu'à présent, je n'ai pas trouvé de moyen de le faire, mais je suis sûr qu'il est là.

modifier:

J'ai renoncé à faire fonctionner cela de manière simple, pour tous les sous-projets inclus. La meilleure réponse que j'ai jusqu'à présent est d'utiliser le plug-in de dépendance pour spécifier (à nouveau) manuellement, chaque sous-module à inclure. L'idée était de pouvoir configurer facilement les POM pour des dizaines de clients, en incluant simplement les modules nécessaires et en les faisant ensuite coller comme par magie tous les pots des sous-modules en un seul endroit. Maven est plutôt sympa, quand vous n'en faites pas grand chose, mais la taxe sur les cornières est incroyable lorsque vous essayez.

Je trouve toujours étrange que de telles tâches d'apparence standard (à en juger par les questions posées sur SO et ce que tout projet normal ferait) soient si difficiles. Maven3 est-il meilleur?

30
Andrew Backer

Vous pouvez essayer le maven-dependency-plugin: copy plugin: goal.

Vous devrez l'ajouter au pom de tous les sous-modules que vous souhaitez copier. EDIT: Ou tout simplement dans le pom parent (voir les commentaires).

    <build>
        <plugins>
            <plugin>
              <groupId>org.Apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <executions>
                <execution>             
                  <id>copy-artifact</id>
                  <phase>package</phase>
                  <goals>
                    <goal>copy</goal>
                  </goals>
                  <configuration>
                    <artifactItems>
                        <artifactItem>
                          <groupId>${project.groupId}</groupId>
                          <artifactId>${project.artifactId}</artifactId>
                          <version>${project.version}</version>
                          <type>${project.packaging}</type>
                        </artifactItem>
                    </artifactItems>
                    <outputDirectory>../Main/target/dependencies</outputDirectory>
                  </configuration>
                </execution>
              </executions>
            </plugin>
        </plugins>
    </build>

Si vous mettez cela dans le pom parent, gardez à l'esprit que cela ne fonctionnera bien que si votre projet entier est profond d'un module. Cela signifie que si les modules sous le module parent ont leurs propres sous-modules, ils ne se retrouveront pas dans le dossier souhaité. La structure de votre dossier ressemblera à ceci:

- Parent
  - Module 1
    - Sub module 1
    **Main**
  - Module 2
  **Main**

Pour éviter cela, créez un module dédié avec la configuration ci-dessus et spécifiez manuellement chaque module que vous souhaitez copier. De cette façon, tous les modules, quelle que soit leur profondeur, se retrouveront dans un dossier.

27
Brambo

J'ai passé toute la journée à essayer de résoudre ce problème ... et finalement cela fonctionne, donc même si je suis sur un calendrier difficile, je vais le partager ici, si je ne peux que sauver la frustration de quelqu'un à l'avenir ...

Étape 1. Créez un projet Maven supplémentaire qui sera le parent de tous les projets que vous souhaitez copier ensemble. Appelons ce projet parent.

Ce projet est nécessaire pour dire à Maven quels projets construire ensemble. De plus, vous déclarerez dans vos autres projets que leur parent est parent, ils verront donc la propriété MyDir que vous définissez ici.

<groupId>com.your.domain</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
    <MyDir>/your/path/to/copy/to</MyDir>
</properties>
<modules>
    <module>../project1</module>
    <module>../project2</module>
    <module>../project2</module>
</modules>

Étape 2. Pour chaque projet que vous souhaitez copier au même emplacement, spécifiez que son parent est le projet parent (assurez-vous que vous spécifiez groupId et artifactId et la version de votre projet parent corrects):

<parent>
    <groupId>com.your.domain</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1</version>
    <relativePath>../parent</relativePath>
</parent>

Et aussi, pour chacun de ces projets, spécifiez également les paramètres des plugins jar et des dépendances, comme ceci:

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
      <configuration>
        <outputDirectory>${MyDir}</outputDirectory>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.your.domain.Program</mainClass>
          </manifest>
        </archive>
     </configuration>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${MyDir}/lib</outputDirectory>
        </configuration>
      </execution>
    </executions>
</plugin>

Ensuite, exécutez simplement mvn install sur le projet parent. Bam!

P.S. Ce qui précède suppose que tous les projets sont situés dans le même répertoire (projet parent à côté des enfants), mais vous pouvez modifier les chemins relatifs comme vous le souhaitez.

15
akuz

Une façon d'y parvenir serait d'utiliser l'option moduleSet de plugin maven Assembly .

Vous pouvez créer un descripteur d'assemblage comme celui-ci (une variante de l'exemple du lien) et l'utiliser dans la déclaration du plugin d'assemblage dans le pom.

<Assembly xmlns="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/plugins/maven-Assembly-plugin/Assembly/1.1.2 http://maven.Apache.org/xsd/Assembly-1.1.2.xsd">
  <id>bin</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects> 
      <binaries>
        <outputDirectory>/</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
</Assembly>
3
Raghuram