Как собрать многомодульный проект maven в одну WAR? - PullRequest
9 голосов
/ 26 октября 2011

Подобный вопрос здесь .

Я хотел бы получить ОДИН результирующий WAR для развертывания из 3 разных модулей maven.Военные модули абсолютно не конфликтуют:

  • Первый, который имеет классы Java и некоторые WEB-INF / артефакты

  • Второй - это просто API-интерфейсы, которые должны присутствовать либо в контейнере, либо в результате войны (это то, что я хочу)

  • Третий - с классами реализации, WEB-INF / артефактами (весенняя инфраструктура, web.xml и т. Д.)

Первый зависит от интерфейсов и реализации.Третий зависит от интерфейсов.

У меня полный беспорядок в возможных вариантах.

Использую ли я для этого оверлеи?

Или я использую плагин сборки, чтобы иметь возможность интегрировать классы из второго?

Использую ли я Грузовой плагин ?

Или это выполняется с помощью maven-war-plugin, если я укажу webResources из другого модуля?Потому что этот чувак делает почти то же самое, что и я, но только с двумя военными модулями, и он не использует ни плагин сборки, ни оверлеи ....

Пожалуйста, скажите мне,как это сделать правильно?

1 Ответ

7 голосов
/ 26 октября 2011

Это просто требует немного продвинутого использования maven jar & war plugin.

Первый, который имеет классы Java и некоторые WEB-INF / артефакты

Допустим, это главная война. Вы просто используете функцию наложения maven-war-plugin. Самый простой способ - указать зависимость от войны:

    <dependency>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}-service-impl</artifactId>
        <version>${version}</version>
        <type>war</type>
        <scope>runtime</scope>
    </dependency>

и скажите плагину maven war объединить активы этой зависимости в основную войну (где мы сейчас находимся)

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>
        <dependentWarExcludes>WEB-INF/web.xml,**/**.class</dependentWarExcludes>
        <webResources>
            <resource>
                <!--  change if necessary -->
                <directory>src/main/webapp/WEB-INF</directory>
                <filtering>true</filtering>
                <targetPath>WEB-INF</targetPath>
            </resource>
        </webResources>
    </configuration>
</plugin>

Вы также включаете зависимость типа jar от второго (это будет JAR в WEB-INF/lib/)

    <dependency>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}-service</artifactId>
        <version>${version}</version>
        <type>jar</type>
    </dependency>

И вам также нужно указать зависимость от классов из третьей WAR:

    <dependency>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}-service-impl</artifactId>
        <version>${version}</version>
        <classifier>classes</classifier>
        <type>jar</type>
    </dependency>

Обратите внимание на классификатор, это необходимо, потому что вы указываете 2 зависимости одного и того же артефакта ... Чтобы заставить его работать, вы должны установить jar-плагин в третьем артефакте (артефакт типа войны), относительно классификатора и тот факт, что вам нужно 2 пакета из одного артефакта (war & jar):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <!-- jar goal must be attached to package phase because this artifact is WAR and we need additional package -->
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>jar</goal>
            </goals>
            <configuration>
            <!-- 
                classifier must be specified because we specify 2 artifactId dependencies in Portlet module, they differ in type jar/war, but maven requires classifier in this case
            -->
                <classifier>classes</classifier>
                <includes>
                    <include>**/**.class</include>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>
...