Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有模块的Maven项目继承结构的最佳实践_Java_Maven - Fatal编程技术网

Java 具有模块的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

我正试图找出为模块化的Maven项目定义继承结构的最佳方法。
让我来介绍一下这个场景。

我正在开发一个可以为不同客户扩展的Web应用程序。
每个个性化都包含自定义GUI组件、数据仓库逻辑等

我创建了主pom.xml,定义为打包,它表示主项目容器,包括共享依赖项和模块定义:

  • 核心库模块:artifactID:cms核心
  • 基本Web应用程序GUI模块工件ID:cms基本应用程序
  • 客户1 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>
  <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

目前,我必须具体说明:

  • 客户模块的版本(上例中为1.11.05)
  • cms基础应用程序模块的verion(上例中为1.11.05)
  • 在我看来,这两个工件必须共享相同的版本号,因为客户应用程序扩展了基本Web应用程序

    一切正常,但我相信有一个最好的方法可以做到这一点。

    有一种方法可以只在cms基础应用程序pom.xml文件上指定版本号,并使每个客户的模块继承该版本号?


    感谢您的建议。

    如果需要,这是一种可能的配置:

    • 一个版本适用于所有“根”模块
    • 每个“客户”模块一个版本
    1.根模块 cms环境

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