带有包含不同版本依赖项的WAR的EAR

时间:2017-04-07 00:54:31

标签: java maven war pom.xml ear

这是我的要求

EAR
WAR(代码)
----依赖性A v1
WAR(代码与上面的WAR相同)
----依赖性A v2

由于WAR项目的代码是相同的,我不想为WAR项目创建多个代码库。所以我正在寻找EAR pom.xml,以便maven使用依赖关系A v1构建WAR,它可以在构建WAR时作为某些属性传递。

EAR pom.xml
...... (模块)
  (webmodule)
    (神器)WAR(/神器)
    依赖版本v1
    (content-path)/ warwithv1(/ content-path)
  (/ webmodule)
  (webmodule)
    (神器)WAR(/神器)
    依赖版本v2
    (content-path)/ warwithv2(/ content-path)
  (/ webmodule)
......

感谢

抱歉XML标记

1 个答案:

答案 0 :(得分:1)

编辑:在评论中澄清后,答案发生了变化。

我现在理解的问题是:如何使用单个POM创建两个具有相同源代码但依赖关系不同的WAR文件。

我建议的解决方案是创建一个父POM,它将为每个WAR指定一个模块。其中一个模块将包含war的源代码并指定一个版本的依赖项。第二个模块将引用第一个模块作为其源代码,并将指定第二个版本的依赖项。

这是我的高级项目结构:

enter image description here

这是顶级(父级)POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven-war-diff-depend</groupId>
    <artifactId>maven-war-diff-depend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <modules>
        <module>module1</module>
        <module>module2</module>
    </modules>
</project>

Module1将指定log4j2的v2.3,这是它的POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>maven-war-diff-depend</groupId>
        <artifactId>maven-war-diff-depend</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>module1</artifactId>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.3</version>
        </dependency>
    </dependencies>
</project>

Module2将指定log4j2的v2.8.1并指向module1以获取其源代码和web.xml文件。请注意,您可能需要执行其他工作来引用module1中的任何其他资源,例如添加更多maven插件和配置。

这是module2 POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>maven-war-diff-depend</groupId>
        <artifactId>maven-war-diff-depend</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>module2</artifactId>
    <packaging>war</packaging>
    <build>
        <sourceDirectory>../module1/src/main/java</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                <webXml>../module1/src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.1</version>
        </dependency>
    </dependencies>
</project>

请注意,我在module1中只有一个Java类,只是为了表明实际上这个类已经编译并包含在module1和module2中:

enter image description here

以下是简单干净安装版本的结果:

enter image description here

enter image description here

一旦你有两个WAR文件构建起来,添加另一个模块(这将是你的EAR)相当简单,它将包含两个WAR文件 - 我相信这是你的最终目标。

所以,创建第三个模块:

enter image description here

将新模块添加到根级别(父级)POM:

<module>module3</module>

在新模块的POM中创建必要的配置。这包括在您使用module1和module2创建的其他两个工件上添加依赖项,并根据需要配置ear插件。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>maven-war-diff-depend</groupId>
        <artifactId>maven-war-diff-depend</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>module3</artifactId>
    <packaging>ear</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-ear-plugin</artifactId>
                <version>2.10</version>
                <configuration>
                    <applicationXml>${basedir}/target/application.xml</applicationXml>
                    <modules>
                        <webModule>
                            <groupId>maven-war-diff-depend</groupId>
                            <artifactId>module1</artifactId>
                        </webModule>
                        <webModule>
                            <groupId>maven-war-diff-depend</groupId>
                            <artifactId>module2</artifactId>
                        </webModule>
                    </modules>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>maven-war-diff-depend</groupId>
            <artifactId>module1</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>maven-war-diff-depend</groupId>
            <artifactId>module2</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <type>war</type>
        </dependency>
    </dependencies>
</project>

现在,当您构建它时,将创建一个EAR,其中包含module1和module2生成的2个WAR。这个例子中的耳朵简称为module3:

enter image description here

enter image description here

编辑:在评论中为每个请求重新添加原始答案。

以下是原始提案中的POM - 使用两个配置文件指定不同的依赖关系版本。和以前一样请注意,在WAR文件中包含servlet api并不是一个好主意,它只是作为一个可视化示例用于显示如何指定常见的依赖项。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>maven-war-diff-depend</groupId>
    <artifactId>maven-war-diff-depend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
    </dependencies>
    <profiles>
        <profile>
            <id>v2.3</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>2.3</version>
                </dependency>
            </dependencies>
        </profile>
        <profile>
            <id>v2.8.1</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.logging.log4j</groupId>
                    <artifactId>log4j-core</artifactId>
                    <version>2.8.1</version>
                </dependency>
            </dependencies>
        </profile>
    </profiles>
</project>