这是我的要求
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标记
答案 0 :(得分:1)
编辑:在评论中澄清后,答案发生了变化。
我现在理解的问题是:如何使用单个POM创建两个具有相同源代码但依赖关系不同的WAR文件。
我建议的解决方案是创建一个父POM,它将为每个WAR指定一个模块。其中一个模块将包含war的源代码并指定一个版本的依赖项。第二个模块将引用第一个模块作为其源代码,并将指定第二个版本的依赖项。
这是我的高级项目结构:
这是顶级(父级)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中:
以下是简单干净安装版本的结果:
一旦你有两个WAR文件构建起来,添加另一个模块(这将是你的EAR)相当简单,它将包含两个WAR文件 - 我相信这是你的最终目标。
所以,创建第三个模块:
将新模块添加到根级别(父级)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:
编辑:在评论中为每个请求重新添加原始答案。
以下是原始提案中的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>