Залежність від Maven WAR


82

Я пишу проект для приймальних випробувань, і з різних причин це залежить від іншого проекту, який упакований як WAR. Мені вдалося розпакувати WAR, використовуючи плагін maven-dependency-plugin, але я не можу змусити мій проект включити розпакований WEB-INF/lib/*.jarі WEB-INF/classes/*бути включеним у шлях до класу, тому збірка не вдається. Чи є спосіб включити ці файли до шляху до класу, чи є кращий спосіб залежно від ВІЙНИ?

Дуже дякую.

Відповіді:


116

Існує ще один варіант, починаючи з maven-war-plugin 2.1-alpha-2. У вашому проекті ВІЙНИ:

<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
Єдина проблема з цим для мене полягає в тому, що це не тягне транзитивних залежностей
hertzsprung

1
Так, дякую за цей натяк :) Це частково спрацювало для мене. З командним рядком maven все нормально. З maven in eclipse (m2e) побудова тестів, що посилаються на класи у війні, теж нормальна, але коли я намагаюся запустити тести (junit), мені потрібно вимкнути дозвіл m2e робочої області, щоб це працювало. В іншому випадку пробіг junit викине ClassNotFoundException для вказаних класів війни. Якимось чином вони не включені до шляху виконання класу junit, хоча військовий проект перелічений у бібліотеці залежностей maven у шляху побудови проекту. Будь-яка ідея?
Гендальф

1
Ви можете додати пом залежності як залежність проекту, щоб отримати транзитивні залежності. Отже, ви отримуєте залежність від занять і від пому
Джонатан Клотьє

Зверніть увагу, що цей плагін повинен входити в <build> налаштування пом.
MichaelCleverly

У моєму випадку мені знадобився src / main / resources / *, і вони також включені в "-classes.jar" - чудово!
Йонас Берлін,

24

Справді, за задумом, Мейвен не вирішує транзитивні залежності війни, оголошеної як залежність від проекту. Насправді існує проблема з цим, MNG-1991 , але вона не буде вирішена в Maven 2.x, і я не впевнений, що не знаю, чи дозволяють накладання вирішити цю проблему. Я розумію запропоноване рішення, щоб дублювати залежності, наприклад, у проекті типу pom.


(РЕДАГУВАТИ: Після ще кількох копань, я знайшов щось цікаве в цій темі, яку я цитую нижче:

Протягом останнього місяця я допомагав у розробці проекту AppFuse, де ми активно використовуємо функцію накладання війни у ​​військовому плагіні Maven. Це справді чудова особливість!

Щоб отримати максимальну потужність за допомогою військових накладок, я розробив плагін Warpath, який дозволяє проектам використовувати військові артефакти як повноцінні залежності. Коротко:

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

Зараз плагін активно використовується в проекті AppFuse протягом останніх кількох місяців, і я відчуваю, що він перебуває на такому етапі, коли він одночасно корисний і стабільний. Чи зацікавлена ​​команда військових плагінів включити функціонал warpath до плагіну війни? Здавалося б, це найприродніше місце для його проведення.

Отже, я не маю досвіду роботи з ним, але плагін 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>
[...]

Потрібні як типи війни, так і тип війни: тип війни використовується плагіном війни Maven для накладання війни, тип війни використовується плагіном Warpath для визначення правильного списку артефактів для включення до шляху шляху проекту.

Я спробую.)


1
Паскаль, у своєму проекті я маю окремі модулі для запуску тесту інтеграції на різних серверах (кожен модуль для одного сервера). Ці тестові модулі мають тестові класи та використовують залежність від війни та накладок. Я чудово працюю.
cetnar

Ну, як я вже писав, я не був впевнений, тож дякую за цей відгук, це добре знати. Чи можете ви просто підтвердити, що це працює з перехідними залежностями війни, а не лише з класами Java війни?
Pascal Thivent,

Добре, дякую. Я бачу, як це працює зараз (важлива частина - ваше друге речення: у вашому тестовому проекті також повинна бути війна упаковки ).
Паскаль Тивент,

1
У мене є проблема з цим плагіном, що він не підтримується m2eclipse: maven.40175.n5.nabble.com / ...
мілан

Цей плагін також порушує як плагіни випуску Maven, так і збірки, оскільки обидва вони намагатимуться вирішити залежності WAR, що використовує плагін warpath, Maven зламає, сказавши, що не може вирішити залежність type = warpath. Шкода, що це не працює.
HDзберегти

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:

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

У наведеному вище прикладі в тестовому проекті я перезаписую файли конфігурації веб-ресурсів (наприклад, контекст тощо).

EDIT: Це рішення не тестувалось на Maven 3.


1
Я проголосував за це, перш ніж перевірити. Я не знаю, чи це тому, що я використовую Maven3, але насправді мої папки / classes та / lib транзитивно включаються через безліч залежностей WAR. Знову - вибачте, що проголосували проти. Мабуть, це «правильна» відповідь.
HDзберегти

4

Хороший момент, Джастіне. Це призвело до того, що я фактично вирішив свою проблему, а саме: включення війни до зборів І включення всіх її перехідних залежностей. Я не міг скопіювати залежність від війни як 'jar', як ви запропонували, оскільки плагін збірки не знайде jar, на який посилається цей groupId / artefactId, але

  • дублювання залежності від війни як типу pom

працює! Війна та її перехідні залежності не включені в збори. Щоб виключити (тепер також з'являється) файл pom, мені довелося додати такий елемент виключення:

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

у мій файл Assembly.xml.

Я думаю, що це також може бути вирішенням початкового питання цієї теми.


-1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.