Подтвердить что ты не робот

Как исключить банки, созданные плагином maven war?

Из-за транзитивных зависимостей мои войны заселяются xml-apis, xerces jars. Я пробовал следовать инструкциям на странице справки для maven-war-plugin, но он не работает.

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

Что я делаю неправильно? Если это имеет значение, я обнаружил, что maven-war-плагин, который я использую, находится в версии 2.1-alpha-1

4b9b3361

Ответ 1

Вы можете пометить эти зависимости, как указано:

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

Таким образом, maven добавит их в путь к компиляции, но не будет их упаковывать. Предполагается, что они существуют в вашем контейнере сервлетов.

Подробнее о maven scopes здесь в разделе "scope"

Edit Если вы хотите удалить классы, добавленные через транзитивные зависимости, вы можете исключить их из зависимости следующим образом:

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

(взято из этого ответа)

Подробнее здесь

Ответ 2

Я исправил его.

Перечитав ссылку немного внимательнее, я обнаружил, что элемент упаковкаExcludes должен быть warSourceExcludes.

Ответ 3

Об исключении транзитивных зависимостей, я думаю, не работает с трансивом транзитивных зависимостей, и я думаю, что это может быть так.

Например, добавьте зависимость hibernate-core → dom4j → xml-apis, если добавить исключение xml-apis рядом с вашим спящим ядром, все равно добавить xml-apis...

Ответ 4

У меня не было возможности модифицировать зависящий файл войны. Мне нужно было избегать старого файла jar из lib. Этот фрагмент конфигурации POM.xml хорошо работает для меня. Я использую 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>
        ....

Ответ 5

Чтобы добавить некоторые пояснения, вы абсолютно можете исключить транзитивные зависимости. Например, если у вас есть локальная зависимость от A, которая имеет зависимость от M, которая, в свою очередь, имеет зависимость от X, то вы можете исключить X, где вы указываете свою зависимость от A.

Например, скажем, вы зависите от 'myPackageA', который зависит от Rampart, который зависит от Xerces, тогда вы можете исключить Xerces в зависимости от 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>

Чтобы проверить ваши зависимости впоследствии, запустите 'mvn dependency: tree' и, надеюсь, вы не увидите никаких зависимостей от ксерок.

Ответ 6

Смотрите мой ответ здесь. Запись packaging-excludes работает только с версией maven-war-plugin 2.1-alpha-1 и выше. Таким образом, вам может потребоваться обновить используемую версию или, вы можете предпочесть использовать инъекцию уровня зависимостей, поскольку это более точное исключение конкретных банок.

Ответ 7

При компиляции с maven 3 (я использовал 3.0.2) с предоставленной областью у вас есть проблема с транзитивными зависимостями (у вас есть лорды JAR внутри WAR). Если вы используете более старые версии maven (я использовал 2.2.1), WAR содержит то, что spected (только зависимые не указаны