Как заставить Maven вести войну: взорвался, но не война: война - PullRequest
51 голосов
/ 09 декабря 2008

У меня есть помп Maven, который использует <packaging>war</packaging>. Но на самом деле я не хочу создавать war-файл, я просто хочу собрать все зависимые файлы jar и создать полный каталог развертывания.

Итак, я запускаю цель war:exploded для создания каталога развертывания:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <configuration>
                <webappDirectory>target/${env}/deploy</webappDirectory>
                <archiveClasses>true</archiveClasses>
            </configuration>
            <goals>
                <goal>exploded</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Проблема в том, что файл войны все еще создается. Есть ли простой способ заставить <packaging>war</packaging> выполнить цель war:exploded вместо войны: цель войны?

Или есть еще один простой способ сделать это?

Ответы [ 5 ]

69 голосов
/ 21 июня 2012

Решение довольно простое. Вам необходимо переопределить выполнение плагина war по умолчанию, чтобы отключить его и добавить собственное выполнение (для разнесенных):

<pluginManagement>
    <plugins>
            <plugin><!-- don't pack the war  -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-war</id>
                        <phase>none</phase>
                    </execution>
                    <execution>
                        <id>war-exploded</id>
                        <phase>package</phase>
                        <goals>
                            <goal>exploded</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    </plugins>
</pluginManagement>
42 голосов
/ 07 октября 2009

Согласно встроенным привязкам жизненного цикла для упаковки в войну в фазе упаковки: война называется mojo.

Вы можете вызвать предыдущий этап подготовки пакета - все действия будут выполнены, и после этого вызов mojo war: exploded

mvn prepare-package war:exploded

Результаты будут такими же, как у вас, но война не будет создана.

9 голосов
/ 26 марта 2015

Я хотел бы перейти на ответ @Michael Wyraz и просто включить установить пропустить настройки на случай, если кто-то выполнит mvn clean install сборку на верхнем уровне многомодульного проекта и одним из подмодулей будет веб-приложение.

Это стоит внутри военного модуля:

<profiles>
    <profile>
        <id>war_explode</id>
        <build>
            <pluginManagement>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.6</version>
                        <executions>
                            <execution>
                                <id>default-war</id>
                                <phase>none</phase>
                            </execution>
                            <execution>
                                <id>war-exploded</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>exploded</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-install-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>default-install</id>
                                <phase>none</phase>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </pluginManagement>
        </build>
    </profile>
</profiles>

Без установка пропустить сборка не удалась при попытке установить war в папку .m2. Сообщение об ошибке выглядит так:

[INFO] --- maven-install-plugin:2.4:install (default-install) @ *** ---
[INFO]   ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.4:install (default-install) on project ***: The packaging for this project did not assign a file to the build artifact -> [Help 1]

Выполнение mvn clean install -P war_explode с этими настройками (в профиле maven с именем war_explode ) завершает сборку без ошибок.

6 голосов
/ 20 сентября 2009

Единственный способ, которым я могу придумать, сделать то, что вы хотите, это настроить использование pom-упаковки (или создать нестандартную упаковку ) и связать требуемые цели из военной упаковки с соответствующими фазами жизненного цикла. , Если вы выберете pom-упаковку, вы можете использовать определение war: war в профиле, чтобы позволить вам упаковать его, но вам нужно будет использовать build-helper-maven-plugin attach-artifact target прикрепить войну к помпу.

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

Привязки жизненного цикла для военной упаковки перечислены в Введение в жизненный цикл сборки (см. Раздел «Привязки жизненного цикла по умолчанию - Упаковка ejb / ejb3 / jar / par / rar / war»).

Чтобы привязать соответствующие исполнения плагина к пакету pom, вы должны сделать следующее:

<build>
  <plugins>
    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <executions>
        <execution>
          <id>process-resources</id>
          <phase>process-resources</phase>
          <goals>
            <goal>resources</goal>
          </goal>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-compile-plugin</artifactId>
      <executions>
        <execution>
          <id>compile</id>
          <phase>compile</phase>
          <goals>
            <goal>compile</goal>
          </goal>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <executions>
        <execution>
          <id>process-test-resources</id>
          <phase>process-test-resources</phase>
          <goals>
            <goal>testResources</goal>
          </goal>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <executions>
        <execution>
          <id>test</id>
          <phase>test</phase>
          <goals>
            <goal>test</goal>
          </goal>
        </execution>
      </executions>
    </plugin>
    <!-- package not wanted, install and deploy already defined for pom packaging-->
    <!--define war:war execution in a profile in case it is needed-->
0 голосов
/ 17 декабря 2008

Насколько я знаю (я все еще новичок в Maven), это невозможно. Единственный жизненный цикл по умолчанию, который вы можете пропустить - это «тест». Для того, чтобы добраться до развертывания, вам необходимо упаковать пакет. Вы можете прочитать все о порядке выполнения жизненного цикла по умолчанию здесь: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference

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