10

类似的问题在这里

我想从 3 个不同的 Maven 模块中部署一个生成的 WAR。战争模块是绝对不冲突的:

  • 第一个具有 Java 类和一些 WEB-INF/工件的

  • 第二个只是 API - 接口 - 必须已经存在于容器中或由此产生的战争的一部分(这就是我想要的)

  • 第三个带有实现类、WEB-INF/artifacts(spring 基础设施、web.xml 等)

第一个取决于接口和实现。第三个取决于接口。

我对可能的选择一团糟。

我为此使用叠加层吗?

或者我是否使用程序集插件来集成第二个类中的类?

我使用Cargo 插件吗?

或者,如果我从不同的模块指定 webResources,它是由 maven-war-plugin 完成的吗?因为这个家伙和我做的几乎一样,但只有 2 个战争模块,而且他不使用汇编插件,也不使用 Overlays....

请告诉我,这是如何正确完成的?

4

1 回答 1

10

这只需要对 maven jar & war 插件进行一些高级使用。

第一个具有 Java 类和一些 WEB-INF/工件的

假设这代表了主要的战争。您只需使用 maven-war-plugin 的 Overlays 功能。最基本的方法是指定战争依赖:

    <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 in 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 插件,关于分类器和事实您需要来自一个工件(war & jar)的 2 个包:

<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>
于 2011-10-26T14:17:34.183 回答