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

82

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

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

deelo55
источник

Ответы:

116

Есть еще один вариант, начиная с 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>
Кристоф Лейтер
источник
6
Единственная проблема с этим для меня в том, что он не
задействует
1
Да, спасибо за подсказку :) У меня частично сработало. С командной строкой maven все в порядке. С maven в eclipse (m2e) сборка тестов, ссылающихся на классы в войне, тоже в порядке, но когда я пытаюсь запустить тесты (junit), мне нужно отключить разрешение рабочей области m2e, чтобы это работало. В противном случае запуск junit вызовет исключение ClassNotFoundException для классов войны, на которые имеются ссылки. Почему-то они не включены в путь к классам выполнения junit, хотя военный проект указан в библиотеке зависимостей maven в пути сборки проекта. Есть идеи?
Гэндальф
1
Вы можете добавить pom зависимости как зависимость проекта, чтобы получить переходные зависимости. Таким образом, вы получаете зависимость от классов и от помпона
Джонатан Клотье
Обратите внимание, что этот плагин должен войти в настройки <build> файла pom.
MichaelCleverly
В моем случае мне понадобились src / main / resources / *, и они также включены в «-classes.jar» - отлично!
Йонас Берлин,
24

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


(РЕДАКТИРОВАТЬ: немного покопавшись, я нашел кое-что интересное в этой теме, которую цитирую ниже:

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

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

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

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

Итак, у меня нет опыта с этим, но плагин 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>
[...]

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

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

Паскаль Тивент
источник
1
Паскаль, в моем проекте есть отдельные модули для запуска интеграционного теста на разных серверах (каждый модуль на один сервер). Эти тестовые модули имеют тестовые классы и используют зависимость войны и оверлеев. Я отлично работаю.
cetnar
Что ж, как я уже писал, я не был уверен, так что спасибо за отзыв, приятно знать. Можете ли вы просто подтвердить, что он работает с транзитивными зависимостями войны, а не только с java-классами войны?
Паскаль Тивент
Хорошо спасибо. Я вижу, как это работает сейчас (важная часть - это ваше второе предложение: в вашем тестовом проекте также должна быть война пакетов ).
Паскаль Тивент,
1
Проблема с этим плагином заключается в том, что он не поддерживается m2eclipse: maven.40175.n5.nabble.com/…
milan
Этот плагин также нарушает работу плагинов выпуска и сборки Maven, потому что оба они будут пытаться разрешить зависимости WAR, использующего плагин warpath, Maven сломается, заявив, что не может разрешить зависимость type = warpath. Жаль, что это не работает.
HDave
14

Используйте оверлеи . Во-первых, ваш тестовый проект должен иметь упаковку.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>

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

РЕДАКТИРОВАТЬ: это решение не тестировалось с Maven 3.

cetnar
источник
1
Я проголосовал против, прежде чем протестировать. Я не знаю, связано ли это с тем, что я использую Maven3, но на самом деле обе папки / classes и / lib транзитивно включаются через несколько зависимостей WAR. Опять же - извините за то, что проголосовал против. Видимо, это «правильный» ответ.
HDave
4

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

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

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

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

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

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

Нильс
источник
-1

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

Джастин
источник