155 votes

Existe-t-il un moyen d'exclure les artefacts hérités d'un POM parent ?

Les artefacts des dépendances peuvent être exclus en déclarant un élément <exclusions> à l'intérieur d'un élément <dependency> Mais dans ce cas, il est nécessaire d'exclure un artefact hérité d'un projet parent. Voici un extrait du POM en question :

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>test</groupId>
  <artifactId>jruby</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
      <artifactId>base</artifactId>
      <groupId>es.uniovi.innova</groupId>
      <version>1.0.0</version>
  </parent>

  <dependencies>      
      <dependency>
          <groupId>com.liferay.portal</groupId>
          <artifactId>ALL-DEPS</artifactId>
          <version>1.0</version>
          <scope>provided</scope>
          <type>pom</type>
      </dependency>
  </dependencies>
</project>

base dépend de l'artefact javax.mail:mail-1.4.jar y ALL-DEPS dépend d'une autre version de la même bibliothèque. En raison du fait que mail.jar de ALL-DEPS existent dans l'environnement d'exécution, bien qu'elles ne soient pas exportées, se heurtent à l'environnement d'exécution. mail.jar qui existe sur le parent, qui est scopé en tant que compile .

Une solution pourrait être de supprimer mail.jar du POM parent, mais la plupart des projets qui héritent de la base en ont besoin (c'est une dépendance transitive pour log4j). Ce que j'aimerais donc faire, c'est simplement exclure la bibliothèque du parent du projet de l'enfant comme cela pourrait être le cas si base était une dépendance et non le pom parent :

...
    <dependency>
        <artifactId>base</artifactId>
        <groupId>es.uniovi.innova</groupId>
        <version>1.0.0</version>
        <type>pom<type>
        <exclusions>
          <exclusion>
             <groupId>javax.mail</groupId>
             <artifactId>mail</artifactId>
          </exclusion>
        </exclusions>
    </dependency>
...

3voto

Ajax Points 849

Le mieux est de rendre intransitives les dépendances dont vous ne voulez pas toujours hériter.

Vous pouvez le faire en les marquant dans le pom parent avec le scope fourni.

Si vous voulez toujours que le parent gère les versions de ces dépôts, vous pouvez utiliser l'option <dependencyManagement> pour configurer les versions que vous souhaitez sans en hériter explicitement, ni transmettre cet héritage aux enfants.

3voto

Yan Khonski Points 9098

J'avais vraiment besoin de faire ce sale boulot... Voici comment

J'ai redéfini ces dépendances avec le champ d'application test . Champ d'application provided n'a pas fonctionné pour moi.

Nous utilisons le plugin Spring Boot pour construire le fat jar. Nous avons un module commun qui définit des bibliothèques communes, par exemple Springfox swagger-2. Mon super-service doit avoir un parent commun (il ne veut pas le faire, mais les règles de l'entreprise l'y obligent !)

Ainsi, mon parent ou mon commons a pom.

<dependencyManagement>

    <!- I do not need Springfox in one child but in others ->

    <dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>${swagger.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>${swagger.version}</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-bean-validators</artifactId>
            <version>${swagger.version}</version>
        </dependency>

       <!- All services need them ->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>${apache.poi.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

Et mon super-service pom.

<name>super-service</name>
<parent>
    <groupId>com.company</groupId>
    <artifactId>common</artifactId>
    <version>1</version>
</parent>

<dependencies>

    <!- I don't need them ->

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-bean-validators</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-core</artifactId>
        <version>2.8.0</version>
        <scope>test</scope>
    </dependency>

    <!- Required dependencies ->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
     <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
    </dependency>
</dependencies>

Il s'agit de la taille de l'artefact gras final

82.3 MB (86,351,753 bytes) - redefined dependency with scope test
86.1 MB (90,335,466 bytes) - redefined dependency with scope provided
86.1 MB (90,335,489 bytes) - without exclusion

Cette réponse vaut également la peine d'être mentionnée - je voulais le faire, mais je suis paresseux... https://stackoverflow.com/a/48103554/4587961

3voto

Viki Jain Points 99

Nous pouvons ajouter le pom parent en tant que dépendance avec le type pom et faire des exclusions sur celui-ci. Car de toute façon, le pom parent est téléchargé. Cela a fonctionné pour moi

<dependency>
  <groupId>com.abc.boot</groupId>
  <artifactId>abc-boot-starter-parent</artifactId>
  <version>2.1.5.RELEASE</version>
  <type>pom</type>
  <exclusions>
    <exclusion>
      <groupId>com.google.code.gson</groupId>
      <artifactId>gson</artifactId>
    </exclusion>
  </exclusions>   
</dependency>

3voto

fritzthecat Points 11

Répétez la dépendance du parent dans le pom.xml de l'enfant et insérez l'exclusion à cet endroit :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.vaadin.external.google</groupId>
            <artifactId>android-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

1voto

bastienb1991 Points 27

Lorsque vous appelez un paquetage mais que vous ne voulez pas de certaines de ses dépendances, vous pouvez faire quelque chose comme ceci (dans ce cas, je ne voulais pas que l'ancien log4j soit ajouté parce que j'avais besoin d'utiliser le plus récent) :

<dependency>
  <groupId>package</groupId>
  <artifactId>package-pk</artifactId>
  <version>${package-pk.version}</version>

  <exclusions>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-core</artifactId>
    </exclusion>
    <exclusion>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-api</artifactId>
    </exclusion>
  </exclusions>
</dependency>

<!-- LOG4J -->
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-core</artifactId>
  <version>2.5</version>
</dependency>
<dependency>
  <groupId>org.apache.logging.log4j</groupId>
  <artifactId>log4j-api</artifactId>
  <version>2.5</version>
</dependency>

Cela fonctionne pour moi... mais je suis assez novice en java/maven donc ce n'est peut-être pas optimal.

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