Как исключить банки, созданные плагином Maven War? - PullRequest
37 голосов
/ 23 июня 2009

Из-за транзитивных зависимостей мои войны заполняются xml-apis, jerces jar. Я пытался следовать инструкциям на странице ссылок для 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

Ответы [ 9 ]

67 голосов
/ 23 июня 2009

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

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

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

Подробнее об областях применения Maven здесь в разделе "scope"

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

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

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

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

5 голосов
/ 25 мая 2010

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

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

5 голосов
/ 23 июня 2009

Я это исправил.

Перечитывая ссылку с большей осторожностью, я обнаружил, что элемент packagingExcludes должен быть warSourceExclude .

3 голосов
/ 27 апреля 2011

У меня не было возможности изменить в зависимости от файла войны. Мне нужно было избежать какого-то старого файла 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>
        ....
2 голосов
/ 19 июня 2018

Правильным решением является использование конфигурации <packagingExcludes>, так как решение <scope>provided</scope> является взломом.

Рассмотрим следующий многомодульный проект:

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

В этом многомодульном проекте для модуля A требуются модули {B, C, D}, но не {e, f, g }. Однако для модулей B и D do требуется {e, f g}, а для C требуется {g}.


Сначала давайте попробуем решить эту проблему с помощью подхода <scope>provided</scope>:

Чтобы исключить {e, f, g} из A, спецификация <scope>provided</scope> должна присутствовать в POM D. Но подождите, B требует {e, f, g}. Поэтому, чтобы исправить это, объявления зависимостей для {e, f, g} должны присутствовать также в POM B<scope>provided</scope>). Это означает, что сложность спецификации зависимости от D должна быть перенесена в B. Аналогично, поскольку C зависит от {g}, объявления зависимостей для {g} должны присутствовать в POM C.

При использовании решения <scope>provided</scope> все модули B, C и D должны знать, что A не может иметь {e, f, g} .

Этот подход нарушает принцип инкапсуляции и не применим в многомодульных проектах, которые имеют сложные графы зависимостей.


Во-вторых, давайте попробуем решить эту проблему с помощью подхода <packagingExcludes>:

Чтобы исключить {e, f, g} из A, в POM A необходимо указать следующее:

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

При таком решении сложность «того, что должно быть исключено из A», содержится только в POM A. Это освобождает модули B, C и D от необходимости заботиться об исключении транзитивных зависимостей ради A.

Это решение поддерживает принцип инкапсуляции.

2 голосов
/ 10 октября 2012

Чтобы добавить некоторые пояснения, вы абсолютно можете исключить транзитивные зависимости. Например, если у вас есть локальная зависимость от 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, и, надеюсь, вы не увидите никаких зависимостей xerces.

1 голос
/ 21 июня 2013

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

0 голосов
/ 09 марта 2018

Вы можете сделать это, указав внутри <packagingExcludes></packagingExcludes> внутри </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>

Вы также можете указать подстановочные знаки и регулярные выражения . Для получения дополнительной информации см. Документацию .

0 голосов
/ 01 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...