practices - spring boot maven multi module project example




Projet multi-module Maven-copier tous les JARS "package" des sous-modules dans parent/target/ (2)

J'ai un projet Maven avec plusieurs 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 de pouvoir les utiliser facilement par la suite.

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

Une version basique 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é certaines suggestions de SO. Jusqu'à présent, je n'ai pas trouvé le moyen de le faire, mais je suis sûr que c'est le cas.

modifier:

J'ai renoncé à ce que cela fonctionne de manière simple, pour tous les sous-projets inclus. La meilleure réponse que j'ai à ce jour consiste à utiliser le plug-in de dépendance pour spécifier manuellement (à nouveau) 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, puis en les faisant coller comme par magie dans un seul emplacement. Maven est plutôt sympa, quand on ne fait pas grand chose avec ça, mais la taxe sur les cornières est incroyable quand on essaie.

Je trouve toujours étrange que de telles tâches d'apparence standard (à en juger par les questions posées sur SO, et ce qu'un projet normal ferait) sont si difficiles. Est-ce que maven3 est meilleur?


J'ai passé toute la journée à essayer de résoudre ce problème ... et finalement ça marche, alors même si je suis sur un calendrier difficile, je le partagerai ici si je peux seulement 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 parent projet.

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, indiquez que celui-ci est le projet parent (assurez-vous de spécifier les paramètres groupId et artifactId corrects et la version de votre projet parent):

<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, lancez simplement mvn install sur le projet parent. Bam!

PS 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 à votre guise.


Une manière d'y parvenir serait d'utiliser l'option moduleSet du plugin moduleSet assembly .

Vous pouvez créer un descripteur d'assemblage comme celui-ci (une variante de l'exemple dans le lien) et l'utiliser dans la déclaration du plug-in 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>




multi-module