3 votes

Plugin Flatten : Résoudre la dependencyManagement de bom sans héritage

J'ai créé un projet d'exemple pour ce problème : https://github.com/robeatoz/flatten-resolve-dependency-management-without-inherited

La structure du projet est la suivante :

  • foo-build comme parent pour tous les modules
  • foo-module-a comme module enfant
  • foo-module-b comme module enfant
  • foo-module-c comme module enfant
  • foo-dépendances comme bom

J'ai utilisé le plugin flatten-maven et la propriété revision pour des constructions compatibles avec le CI dans tous les modules :

<groupId>stack.overflow</groupId>
<artifactId>foo-build</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>

<properties>
    <revision>0.1-SNAPSHOT</revision>
</properties>

Le parent (foo-build) gère une dépendance externe :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>external.artifact</groupId>
            <artifactId>module-managed-in-parent</artifactId>
            <version>1.2.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Le bom (foo-dependencies) gère les dépendances de foo :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-a</artifactId>
            <version>${revision}</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-b</artifactId>
            <version>${revision}</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-c</artifactId>
            <version>${revision}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Je veux que le pom aplati de la bom ne contienne que les dépendances résolues de foo sans les dépendances gérées par le parent (foo-build) comme ceci :

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-a</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-b</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>stack.overflow</groupId>
            <artifactId>foo-module-c</artifactId>
            <version>0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Comment devez-vous configurer le plugin flatten-maven pour y parvenir ?

J'ai déjà essayé <flattenMode>bom</flattenMode> mais le pom aplati ne résout pas les versions :

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-a</artifactId>
      <version>${revision}</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-b</artifactId>
      <version>${revision}</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-c</artifactId>
      <version>${revision}</version>
    </dependency>
  </dependencies>
</dependencyManagement>

Avec la configuration suivante

<pomElements>
    <properties>remove</properties>
    <dependencyManagement>resolve</dependencyManagement>
</pomElements>

le pom aplati contient la dépendance gérée du parent :

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-a</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-b</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>stack.overflow</groupId>
      <artifactId>foo-module-c</artifactId>
      <version>0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>external.artifact</groupId>
      <artifactId>module-managed-in-parent</artifactId>
      <version>1.2.3</version>
    </dependency>
  </dependencies>
</dependencyManagement>

1voto

ursa Points 27

Il serait plus simple de modifier votre approche de manière plus centré sur le client :

  1. Faire foo-dépendances un projet Root ( ./pom.xml ).

    • avec seulement foo-* dépendances dans la section de gestion des dépendances
    • la liste des modules avec un seul foo-build module (serait tronqué par le plugin flatten)
    • propriétés génériques du projet (qui seraient tronquées par le plugin flatten)
  2. Faire foo-build un projet intermédiaire ( ./foo-build/pom.xml ).

    • avec des dépendances tierces dans la section de gestion des dépendances
    • avec des propriétés ou des profils spécifiques au bâtiment, requis par votre projet (le cas échéant)
  3. Conserver foo-module-* modules à feuilles avec foo-build en tant que parent

Si vous insistez sur une structure de projet simple ( ./foo-module-*/pom.xml ), vous pouvez utiliser relativePath pour pointer le module parent, par exemple :

<parent>
    <groupId>stack.overflow</groupId>
    <artifactId>foo-build</artifactId>
    <version>${revision}</version>
    <relativePath>../foo-build/pom.xml</relativePath>
</parent>

<artifactId>foo-module-a</artifactId>

De cette façon, vous recevrez :

  • clair foo-dépendances comme vous le souhaitez ;
  • zéro copier-coller pour foo-* dépendances ;
  • la possibilité de construire ce que vous voulez et comme vous le voulez dans foo-build sans effets secondaires sur foo-dépendances (ni maintenant ni à l'avenir).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X