Java 具有模块的Maven项目继承结构的最佳实践
我正试图找出为模块化的Maven项目定义继承结构的最佳方法。Java 具有模块的Maven项目继承结构的最佳实践,java,maven,Java,Maven,我正试图找出为模块化的Maven项目定义继承结构的最佳方法。 让我来介绍一下这个场景。 我正在开发一个可以为不同客户扩展的Web应用程序。 每个个性化都包含自定义GUI组件、数据仓库逻辑等 我创建了主pom.xml,定义为打包,它表示主项目容器,包括共享依赖项和模块定义: 核心库模块:artifactID:cms核心 基本Web应用程序GUI模块工件ID:cms基本应用程序 客户1 Web应用程序模块 客户网络应用模块 Pom.xml定义如下: <project xmlns=&quo
让我来介绍一下这个场景。
我正在开发一个可以为不同客户扩展的Web应用程序。
每个个性化都包含自定义GUI组件、数据仓库逻辑等 我创建了主pom.xml,定义为打包,它表示主项目容器,包括共享依赖项和模块定义:
- 核心库模块:artifactID:cms核心
- 基本Web应用程序GUI模块工件ID:cms基本应用程序
- 客户1 Web应用程序模块
- 客户网络应用模块
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
<packaging>pom</packaging>
<name>cms.env</name>
<description>...</description>
<properties>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<build>
...
</build>
<dependencies>
...
</dependencies>
<modules>
<module>cms-core</module>
<module>cms-base-app</module>
...
<module>cms-customer1</module>
...
</modules>
</project>
4.0.0
it.isipc
cms环境
0.0.0
聚甲醛
cms.env
...
1.8
1.8
...
...
cms核心
cms基础应用程序
...
cms-customer1
...
基本上,我通常在核心库和基础应用程序模块上进行更改。
每次我在这些模块上发布新版本时,我都需要更新每个客户模块的pom.xml,以便在提到的工件的最后发布版本更新它们。
下面是客户web应用程序**pom.xml**的示例:
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
</parent>
<version>1.11.05</version>
<artifactId>cms-customer1</artifactId>
<packaging>war</packaging>
<name>cms-customer1/name>
<description>...</description>
<dependencies>
<dependency>
<groupId>it.isipc</groupId>
<artifactId>cms-base-app</artifactId>
<type>war</type>
<version>1.11.05</version>
</dependency>
<dependency>
<groupId>it.isipc</groupId>
<artifactId>cms-core</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
</project>
4.0.0
it.isipc
cms环境
0.0.0
1.11.05
cms-customer1
战争
cms-customer1/名称>
...
it.isipc
cms基础应用程序
战争
1.11.05
it.isipc
cms核心
1.1.3
目前,我必须具体说明:
有一种方法可以只在cms基础应用程序pom.xml文件上指定版本号,并使每个客户的模块继承该版本号?
感谢您的建议。如果需要,这是一种可能的配置:
- 一个版本适用于所有“根”模块
- 每个“客户”模块一个版本
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
<packaging>pom</packaging>
<modules>
<module>cms-core</module>
<module>cms-base-app</module>
<module>cms-customer1</module>
</modules>
如果cms基本应用程序
依赖于cms核心
(如第1部分所述),则无需在此处的客户模块中添加它
3.生命周期
当customer1
发展时,只需编辑其pom(更改版本)。当“根”模块更改时,必须更新所有POM。 要执行此操作,请转到
cms env
目录,然后:mvn版本:set-DnewVersion=0.0.1
如果一切正常,您可以使用验证更改:
mvn版本:提交
否则,您可以使用:
返回到以前的POM
mvn版本:回滚
在您给出的示例中,有许多版本:cms-env:0.0.0
,cms-base-app:1.11.05
,cms-core:1.1.3
,cms-customer1:1.11.05
。我认为所有的“根”模块(env、core、base-app)都应该有相同的版本。但每个客户模块都应该能够以自己的方式发展(新功能、错误修复等)。即使customer
“扩展”cms-env
,它也可以有自己的版本。那么,你认为一个版本的“根”模块和一个版本的每个客户模块是可以的,还是你更喜欢一个单一版本的所有?嗨@Tigger谢谢你的回答。我同意:每个客户模块都有自己的发展方式。我认为一个版本的“根”模块和每个客户模块一个版本可能是最好的解决方案。我面临的主要问题是,每次更新一个“根”模块时,我都必须手动更新每个客户模块中的引用。我正试图找到一种简单/自动的方法来实现这一点。首先,为什么要使用战争作为依赖项?第二个最好的方法是在父级中为一般依赖项设置dependencyManagement。第三,为什么不同的模块有不同的版本?多模块的目的是为所有模块提供相同的版本…@khmarbaise我使用war作为依赖项,因为我包含了未部署在Maven存储库中的旧脚本(当然,我可以改进这种管理,只需要更多时间)。我已经在'cms env'pom.xml中的“root”模块中管理了一般依赖项(我在示例中省略了它们)。您认为,如果我更改了某个客户组件/逻辑的版本,我应该更改所有模块的版本吗?我不认为这是一个更好的解决方案。。。我想只有一般依赖项和公共库必须共享版本号。谢谢您的建议。我花了一些时间来测试它。我过几天就回答你了我试过你的解决方案,效果很好。基本上,“cms核心”和“cms基础应用程序”共享主要项目版本号,每个客户实现都遵循自己的版本控制方式。也许,能够控制每个核心工件版本会更好,但是在这个环境中,两个核心工件都是主项目。共享同一个版本号付出的代价很小。我将您的安斯威尔标记为已接受的安斯威尔。谢谢您的帮助,干杯。
<artifactId>cms-core</artifactId>
<parent>
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
</parent>
<artifactId>cms-base-app</artifactId>
<parent>
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cms-core</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<artifactId>cms-customer1</artifactId>
<version>1.2.3</version>
<parent>
<groupId>it.isipc</groupId>
<artifactId>cms-env</artifactId>
<version>0.0.0</version>
</parent>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cms-base-app</artifactId>
<version>${parent.version}</version>
</dependency>
</dependencies>