【问题标题】:How to assemble multimodule maven project into one WAR?如何将多模块maven项目组装成一个WAR?
【发布时间】:2011-10-25 23:39:19
【问题描述】:

类似问题here

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

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

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

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

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

我对可能的选择一团糟。

我是否为此使用叠加层?

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

我使用Cargo plugin 吗?

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

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

【问题讨论】:

    标签: java war maven-3 maven-assembly-plugin multi-module


    【解决方案1】:

    这只需要对 maven jar 和 war 插件的一些高级使用。

    第一个具有 Java 类和一些 WEB-INF/artifacts

    假设这代表了主要的战争。您只需使用 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 类型依赖项(它将是 WEB-INF/lib/ 中的 JAR)

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

    【讨论】:

    • 谢谢,很有帮助。起初没有意识到 jar 插件实际上必须在第三个项目的 pom 文件中使用。包含它之后,一切都完美无缺。
    猜你喜欢
    • 2011-02-11
    • 2012-03-06
    • 2011-04-11
    • 2014-06-12
    • 2021-01-04
    • 2018-08-15
    • 2022-01-16
    • 2014-05-22
    • 1970-01-01
    相关资源
    最近更新 更多