Зависимость от Maven WAR

Я пишу проект для приемочных испытаний, и по разным причинам это зависит от другого проекта, который упакован как WAR. Мне удалось распаковать WAR с помощью модуля maven-dependency-plugin, но я не могу заставить мой проект включать распакованные WEB-INF/lib/*.jar и WEB-INF/classes/* для включения в путь к классам, поэтому сборка не выполняется. Есть ли способ включить эти файлы в путь к классам или есть лучший способ в зависимости от WAR?

Большое спасибо.

Ответ 1

Есть еще один вариант с maven-war-plugin 2.1-alpha-2. В проекте WAR:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

Это создает артефакт классов, который вы можете использовать в проекте приемочных испытаний с помощью:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>

Ответ 2

Действительно, по дизайну, Maven не разрешает транзитивные зависимости войны, объявленной как зависимость проекта. На самом деле есть проблема, MNG-1991, но она не будет решена в Maven 2.x и Я не уверен, что Я не знаю, позволяют ли оверлеи обходить эту проблему. Мое понимание предлагаемого решения заключается в дублировании зависимостей, например, в проекте типа pom.


(EDIT: после некоторого дополнительного копания я нашел что-то интересное в этот поток, который я цитирую ниже:

Я помогал в разработке проекта AppFuse в прошлом месяце, когда мы широко используем функцию оверлейной войны в Maven военный плагин. Это действительно замечательная функция!

Чтобы получить максимальную мощность с помощью военных накладок, я разработал плагин Warpath что позволяет проектам использовать военные артефакты как полноценные зависимости. Вкратце:

1) Содержимое каталога /WEB -INF/classes в военной зависимости артефакты могут быть включены в путь класса проекта для нормального компиляции, и т.д.

2) Переходные зависимости от артефактов военной зависимости становятся доступный для использования другими плагинами, например. скомпилировать и ухо - так больше нет чтобы включить все зависимости при создании тощих войн!

Плагин теперь активно используется в проекте AppFuse для последние несколько месяцев, и я чувствую, что он находится в точке, где он является и полезным, и стабильный. Будет ли команда плагина войны заинтересована в включении пути войны функциональность внутри плагина войны? Казалось бы, это самое естественное место для его размещения.

Итак, у меня нет опыта с этим, но плагин maven warpath действительно выглядит красиво и просто и доступен в центральном Сделки рЕПО. Чтобы использовать его, включите в свой файл pom.xml следующий элемент конфигурации плагина:

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

И добавьте военные зависимости, которые вы хотите включить в путь к классам, в качестве зависимостей типа warpath:

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

Необходимы типы зависимости от войны и warpath: тип войны используется плагином войны Maven для выполнения наложения войны, тип warpath используется плагином Warpath для определения правильного списка артефактов для включения в проект CLASSPATH.

Я бы попробовал.)

Ответ 3

Используйте overlays. Во-первых, ваш тестовый проект должен иметь также упаковку war.

Объявить зависимость от проекта войны, который вы хотите проверить:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

затем настройте накладку maven-war-plugin:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

В приведенном выше примере в тестовом проекте я перезаписываю файлы конфигурации webresources (например, conxtext и т.д.).

EDIT: Это решение не было протестировано с Maven 3.

Ответ 4

Хорошая точка, Джастин. Это помогло мне решить мою проблему, а именно: включая войну в сборку И включая все ее транзитивные зависимости. Я не мог дублировать зависимость от войны как "jar", как вы предлагали, поскольку плагин сборки не нашел баночку, на которую ссылается эта группаId/artefactId, но

  • дублирование зависимости от войны как тип pom

работает! Война и ее транзитивные зависимости не включены в сборку. Чтобы исключить файл pom (теперь также появляющийся), мне пришлось добавить элемент exclude следующим образом:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

в мой файл assembly.xml.

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

Ответ 5

Если вы указываете зависимость от военного проекта как зависимость от jar, он, похоже, забирает необходимые банки/ресурсы. Я использую Maven 2.2 + m2eclipse.