Зависимость от 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.