web-dev-qa-db-fra.com

Comment exclure les pots générés par le plugin maven war?

En raison des dépendances transitives, mes guerres sont remplies par xml-apis, xerces jars . J'ai essayé de suivre les instructions de la page de référence de maven-war-plugin mais cela ne fonctionne pas.

<plugin>
    <groupId>org.Apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
      <packagingExcludes>WEB-INF/lib/xalan-2.6.0.jar,WEB-INF/lib/xercesImpl-2.6.2.jar,WEB-INF/lib/xml-apis-1.0.b2.jar,WEB-INF/lib/xmlParserAPIs-2.6.2.jar</packagingExcludes>
      <webXml>${basedir}/src/main/webapp/WEB-INF/web.xml</webXml>
      <warName>project1</warName>
      <warSourceDirectory>src/main/webapp</warSourceDirectory>
    </configuration>
</plugin>

Qu'est-ce que je fais de mal? Si c'est important, j'ai découvert que le plugin maven-war-war que j'utilise est à la version 2.1-alpha-1

36

Vous pouvez marquer ces dépendances comme prévu:

<dependency>
  <groupId>xerces</groupId>
  <artifactId>xerces</artifactId>
  <version>2.4.0</version>
  <scope>provided</scope>
</dependency>

De cette façon, le maven les ajoutera au chemin de classe de la compilation, mais ne les conditionnera pas. Il est supposé qu'ils existent dans votre conteneur de servlet.

En savoir plus sur maven scopes ici sous "scope"

Edit Si vous souhaitez supprimer les classes ajoutées via des dépendances transitives, vous pouvez les exclure de la dépendance comme ceci:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5.6</version>
        <exclusions>
                <exclusion>
                        <groupId>commons-logging</groupId>
                        <artifactId>commons-logging</artifactId>
                </exclusion>
        </exclusions>
</dependency>

(tiré de cette réponse )

Voir plus ici

66
David Rabinowitz

Je l'ai corrigé.

En relisant la référence avec un peu plus d'attention, j'ai découvert que l'élément packagingExcludes devrait être warSourceExcludes .

5

À propos de l’exclusion des dépendances transitives, je ne pense pas que cela fonctionne avec les dépendances transitives, et je pense que cela pourrait être le cas.

Par exemple, ajoutez la dépendance de hibernate-core -> dom4j -> xml-apis si vous ajoutez une exclusion de xml-apis près de votre hibernate-core, ajoutez quand même xml-apis ...

5
accreativos

Je n'avais aucune possibilité de modifier le fichier de guerre dépendant. J'avais besoin d'éviter un vieux fichier jar de lib. Cet extrait de la configuration de POM.xml me convient bien. J'utilise Maven 2.2.

<build>
    <plugins>
        <!-- put aside some unwanted jars from war...-->
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <overlays>
                    <overlay>
                        <groupId>com.company.app</groupId>
                        <artifactId>web_app</artifactId>
                        <excludes>
                            <exclude>WEB-INF/lib/json-lib-2.2.2-jdk13.jar</exclude>                                
                        </excludes>
                    </overlay>
                </overlays>
            </configuration>
        </plugin>
        ....
3
SmithHCoder

Pour ajouter quelques précisions, vous pouvez absolument exclure les dépendances transitives. Par exemple, si vous avez une dépendance locale sur A, qui a une dépendance sur M, qui à son tour a une dépendance sur X, vous pouvez alors exclure X lorsque vous spécifiez votre dépendance A.

Par exemple, supposons que vous dépendiez de 'myPackageA', qui dépend de Rampart, qui dépend de Xerces, vous pouvez alors exclure Xerces dans votre dépendance myPackageA:

 <groupId>myPackageA.dependsOnRampart.whichDependsOnXerces</groupId>
 <artifactId>someArtifact</artifactId>
 <version>2.1</version>
 <exclusions>
   <exclusion>
     <groupId>org.Apache.xerces</groupId>
     <artifactId>xmlParserAPIs</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.Apache.xerces</groupId>
     <artifactId>xml-apis</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.Apache.xerces</groupId>
     <artifactId>xercesImpl</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.Apache.xerces</groupId>
     <artifactId>resolver</artifactId>
   </exclusion>
   <exclusion>
     <groupId>org.Apache.xerces</groupId>
     <artifactId>serializer</artifactId>
   </exclusion>
 </exclusions>

Pour vérifier vos dépendances par la suite, lancez 'mvn dependency: tree' et espérons que vous ne verrez aucune dépendance xerces.

2
MattC

Voir ma réponse ici . L'entrée packaging-excludes ne fonctionne qu'avec la version de plug-in maven-war 2.1-alpha-1 et supérieur . Ainsi, vous devrez peut-être mettre à niveau la version utilisée ou, vous préférerez peut-être utiliser l'injection de niveau de dépendance, car elle exclut de manière plus précise des jars spécifiques.

1
wmorrison365

La solution correcte consiste à utiliser la configuration <packagingExcludes>, car la solution <scope>provided</scope> est un hack.

Considérez le projet multi-module suivant:

        A
      (war)
      /   \
     B     C
   (jar) (jar)
    /     /
   D     /
 (jar)  /
 / | \ /
e  f  g

Dans ce projet multi-module, le module A requiert les modules {B, C, D}, mais non {e, f, g}. Cependant, les modules B et Ddo nécessitent {e, fg} et C nécessitent {g}.


Tout d'abord, essayons de résoudre ce problème avec l'approche <scope>provided</scope>:

Pour exclure {e, f, g} de A, la spécification <scope>provided</scope> doit être présente dans le POM de D. Mais attendez, B nécessite {e, f, g}. Donc, pour résoudre ce problème, les déclarations de dépendance pour {e, f, g} doivent également figurer dans le POM de B (avec <scope>provided</scope>). Cela signifie que la complexité de la spécification de dépendance de D doit être extraite dans B. De même, puisque C dépend de {g}, les déclarations de dépendance pour {g} doivent être présentes dans le POM de C.

Avec la solution <scope>provided</scope>, les modules B, C et D doivent tous avoir connaissance du fait que A ne peut pas avoir {e, f, g}.

Cette approche casse le principe d'encapsulation et n'est pas pratique dans les projets multi-modules comportant des graphes de dépendance complexes.


Deuxièmement, essayons de résoudre ce problème avec l’approche <packagingExcludes>:

Pour exclure {e, f, g} de A, vous devez fournir les éléments suivants dans le POM de A:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
      <packagingExcludes>a*.jar,b*.jar,c*.jar</packagingExcludes>
    </configuration>
</plugin>

Avec cette solution, la complexité de "ce qui doit être exclu de A" est uniquement contenue dans le POM de A. Ceci libère les modules B, C et D de l'obligation d'exclure les dépendances transitives au profit de A.

Cette solution respecte le principe d'encapsulation.

1
Seva Safris

Vous pouvez le faire en spécifiant dans <packagingExcludes></packagingExcludes> dans </configuration><configuration>.

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <packagingExcludes>
            WEB-INF/lib/ex1-*.jar,
            WEB-INF/lib/ex2-logging-*.jar
          </packagingExcludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Vous pouvez également spécifier par caractères génériques et expressions régulières. Reportez-vous à la documentation pour plus d'informations.

0
Supun Wijerathne

Lorsque vous compilez avec maven 3 (j’utilisais la version 3.0.2) avec scope fourni vous avez le problème avec les dépendances transitives (vous avez des jars dans le fichier WAR) J'ai utilisé 2.2.1), le WAR contient ce qui est détecté (uniquement les dépendances non fournies

0
greuze