webentwicklung-frage-antwort-db.com.de

Wie kann ich die von Maven War Plugin erzeugten Gläser ausschließen?

Aufgrund von transitiven Abhängigkeiten werden meine Kriege mit xml-apis, xerces jars ..__ bevölkert ... Ich habe versucht, den Anweisungen auf der Referenzseite für Maven-War-Plugin zu folgen, aber es funktioniert nicht.

<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>

Was mache ich falsch? Wenn es wichtig ist, habe ich festgestellt, dass das von mir verwendete Maven-War-Plugin in Version 2.1-alpha-1 ist

36

Sie können diese Abhängigkeiten als angegeben markieren:

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

Auf diese Weise fügt der Maven sie dem Kompilierungsklassenpfad hinzu, packt sie jedoch nicht. Es wird davon ausgegangen, dass sie in Ihrem Servlet-Container vorhanden sind.

Mehr über Maven Scopes hier unter "Scope"

Edit Wenn Sie Klassen entfernen möchten, die über transitive Abhängigkeiten hinzugefügt wurden, können Sie sie wie folgt aus der Abhängigkeit ausschließen:

<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>

(genommen aus dieser Antwort )

Mehr hier

66

Ich habe es repariert.

Ich las die Referenz mit ein wenig mehr Sorgfalt und stellte fest, dass das Element packagingExcludeswarSourceExcludes sein sollte.

Über den Ausschluss von transitiven Abhängigkeiten denke ich, dass ich nicht mit Transitivität von transitiven Abhängigkeiten arbeiten kann, und ich denke, dass dies der Fall sein könnte.

Fügen Sie beispielsweise Abhängigkeit von Hibernate-Core -> dom4j -> xml-apis hinzu, wenn Sie in der Nähe Ihres Hibernate-Core Ausschluss von xml-apis hinzufügen. Fügen Sie weiterhin xml-apis hinzu.

5
accreativos

Ich hatte keine Möglichkeit, die Kriegsdatei zu ändern. Ich musste einige alte JAR-Dateien aus der lib vermeiden. Dieser Ausschnitt der POM.xml-Konfiguration funktioniert für mich gut. Ich benutze 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

Sie können zur Klarstellung unbedingt transitive Abhängigkeiten ausschließen. Wenn Sie beispielsweise eine lokale Abhängigkeit von A haben, die eine Abhängigkeit von M hat, die wiederum eine Abhängigkeit von X hat, können Sie X ausschließen, wo Sie Ihre A-Abhängigkeit angeben.

Angenommen, Sie hängen von 'myPackageA' ab, das von Rampart abhängt, das von Xerces abhängt. Dann können Sie Xerces in Ihrer myPackageA-Abhängigkeit ausschließen:

 <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>

Um Ihre Abhängigkeiten anschließend zu überprüfen, führen Sie 'mvn dependency: tree' aus, und hoffentlich sehen Sie keine Xerces-Abhängigkeiten.

2
MattC

Siehe meine Antwort hier . Der packaging-excludes-Eintrag funktioniert nur mit der Maven-War-Plugin-Version 2.1-alpha-1 und höher . Daher müssen Sie möglicherweise die verwendete Version aktualisieren, oder Sie ziehen es vor, die Injektion auf Abhängigkeitsebene zu verwenden, da bestimmte Gläser genauer ausgeschlossen werden.

1
wmorrison365

Die richtige Lösung ist die Verwendung der <packagingExcludes>-Konfiguration, da die <scope>provided</scope>-Lösung ein Hack ist.

Betrachten Sie das folgende Multi-Modul-Projekt:

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

In diesem Projekt mit mehreren Modulen erfordert das Modul A die Module {B, C, D}, aber not {e, f, g}. Für die Module B und Ddo sind jedoch {e, fg} und C {g} erforderlich.


Zuerst wollen wir versuchen, dieses Problem mit dem <scope>provided</scope>-Ansatz zu lösen:

Um {e, f, g} von A auszuschließen, muss die <scope>provided</scope>-Spezifikation im POM von D vorhanden sein. Aber warten Sie, B erfordert {e, f, g}. Um dies zu beheben, müssen die Abhängigkeitsdeklarationen für {e, f, g} auch in POM der B (mit <scope>provided</scope>) vorhanden sein. Dies bedeutet, dass die Komplexität der Abhängigkeitsspezifikation von D in B gezogen werden muss. Da C von {g} abhängt, müssen die Abhängigkeitsdeklarationen für {g} ebenfalls im POM von C vorhanden sein.

Bei der <scope>provided</scope>-Lösung müssen die Module B, C und D alle wissen, dass A nicht e, f, g} haben kann.

Dieser Ansatz verstößt gegen das Prinzip der Kapselung und ist bei Projekten mit mehreren Modulen mit komplexen Abhängigkeitsgraphen nicht praktikabel.


Zweitens versuchen wir, dieses Problem mit dem <packagingExcludes>-Ansatz zu lösen:

Um {e, f, g} von A auszuschließen, müssen Sie Folgendes in POM von A angeben:

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

Bei dieser Lösung ist die Komplexität von "was von A ausgeschlossen werden muss" ausschließlich in POM von A enthalten. Dies befreit die Module B, C und D von der Notwendigkeit, transitive Abhängigkeiten für A auszuschließen.

Diese Lösung hält das Prinzip der Verkapselung ein.

1
Seva Safris

Sie können dies tun, indem Sie <packagingExcludes></packagingExcludes> in </configuration><configuration> angeben.

<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>

Sie können auch durch Platzhalter und reguläre Ausdrücke angeben. Weitere Informationen finden Sie in der Dokumentation .

0

Bei der Kompilierung mit Maven 3 (ich habe 3.0.2 verwendet) mit angegebenem Umfang haben Sie das Problem mit den transitiven Abhängigkeiten (Sie haben eine Menge JARs in der WAR). Ich habe 2.2.1 verwendet), der WAR enthält das, was gesehen wird (nur Abhängigkeiten nicht vorausgesetzt

0
greuze