如何重组的Maven多模块项目?(How to restructure Maven multi-mo

2019-06-24 04:33发布

我appologize为这篇文章的长度,但我有麻烦使它更加简洁没有呈现的画面。 我最近继承构建主的工作的行家3.0多模块项目。 问题是,该项目/模块的结构是一场灾难。 从事物当前存储在源代码管理办法(我们使用RTC)的模块的POM结构,我在撕我的头发试图让一个完整的构建周期,每次完成。

随着项目的层次去,所有的模块都存储“平”; 即:一切都在同一水平。 我有一个父POM,和所有模块依赖于父母。 然而,父母是在同一水平作为我的所有其它模块。

例如:

c:\dev\MyEarProject
 + parent-pom
   - pom.xml
 + module1
   - pom.xml (depends on parent-pom)
   - src
   -   main
   -     ...
 + module2
   - pom.xml (depends on parent-pom)
   - src
   -   main
   -     ...
 + module3
   - pom.xml (depends on parent-pom)
   - src
   -   main
   -     ...

父POM定义了所有建设项目,以及一群在整个不同的子模块使用神器版本号属性所需的模块:

<modules>
  <module>../module1</module>
  <module>../module2</module>
  <module>../module3</module>
</modules>

<properties>
    <org.springframework.version>3.0.5.RELEASE</org.springframework.version>
    <slf4j.version>1.6.4</slf4j.version>
    <repositoryAddress>${snapshots.repo.url}</repositoryAddress>
    <my.hibernate-module.dao.impl>1.2.3</my.hibernate-module.dao.impl>
    <my.hibernate-module.dao.api>1.2.3</my.hibernate-module.dao.api>
</properties>

每个模块的POM,反过来,取决于通过POM的神器数量父POM:

<parent>
    <groupId>com.cws.cs.lendingsimulationservice</groupId>
    <artifactId>parent-pom</artifactId>
    <version>1.0.6</version>
</parent>

为了让事情更加混乱,实际的工件名称可能或可能不会(取决于模块),匹配模块路径。 例如,模块1可以位于路径c:\dev\MyEarProject\module1 ,但具有工件名称hibernate-module 。 但是,由于它存储在RTC的方式,目录名为module1时检查出。

构建一切最简单的方法,当然,是去到c:\dev\MyEarProject\parent-pom\和运行mvn clean deploy 。 这工作得很好,当在拍照模式下作为快照回购允许对同一工件版本的多个部署。 但是在释放模式,此操作失败。

这种结构是造成我2个问题。

  1. 每次我需要做一个版本更改到父的属性,我必须更新父POM版本号和所有子模块父POM的版本,并且所有子模块本身的版本(因为家长改变)。
  2. 每当我需要部署一个发布周期,MVN如果将一个模块并没有从上次周期变化引发错误,因此不能被重新部署到同一回购(回购不允许覆盖现有工件)

所以我在寻找重组项目,以避免这些问题的最佳途径。 对于父POM,我知道我可以使用相对路径指向父来代替。 然而,考虑到模块的“扁平化”的结构,这是一个推荐的方法(即:父POM的相对路径将是../parent-pom/pom.xml - 似乎有点奇怪我)? 此外,考虑到父母的版本控制是独立的模块,将使用相对路径不只是开门额外的混乱(即:就没有办法知道父POM的哪个版本与版本相关的子模块)。

其次,我怎么可以创建一个没有遇到我有部署错误,整个耳朵? 由于神器已经在回购存在,我并不需要重建和重新部署。 我尝试使用--projects但所涉及的模块数,它变得非常难以管理。

Answer 1:

我真的建议的第一件事,就是要调整项目文件夹...这意味着有项目文件夹代表指的不仅扁平化结构的结构。

  +-- parent-pom (pom.xml)
       +--- module1 (pom.xml)
       +--- module2 (pom.xml)
       +--- module3 (pom.xml)

由于该模块部分父进程将被简化这样的结果:

<modules>
  <module>module1</module>
  <module>module2</module>
  <module>module3</module>
</modules>

此外,在你的模块父项可以简化,以及这样的:

<parent>
  <groupId>com.cws.cs.lendingsimulationservice</groupId>
  <artifactId>parent-pom</artifactId>
  <version>1.0.6</version>
</parent>

......这使我下一个点:

如果你所有的当前项目定义他们的父母如上所述,这是完全错误的,原因将试图找到在存储库中,而不是在上一级文件夹的父。 换句话说,这是释放等多你的问题造成

如果我们要解决这个问题,它看起来像这样,我不能建议:

<parent>
  <groupId>com.cws.cs.lendingsimulationservice</groupId>
  <artifactId>parent-pom</artifactId>
  <version>1.0.6</version>
  <relativePath>../parent-pom/pom.xml</relativePath>
</parent>

这是我观察到的另一件事是,你不使用SNAPTSHOT的,将被释放插件中释放阶段所取代。 而在关系到它会自动更改相应的父母等所有版本

在理想情况下,你的模块应该是这样的:

<parent>
  <groupId>com.cws.cs.lendingsimulationservice</groupId>
  <artifactId>parent-pom</artifactId>
  <version>1.0.6</version>
</parent>

<artifactId>module-1</artifactId>
<!-- No Version or groupId -->

因为所有组件将继承版本groupId从他们的父母。 有时它是有用的或需要改变一个模块groupId ,但它是一个例外。

在事我重读是关于母公司的独立版本。 这根本没有意义,因为它是自己的模块的父母因此把它放到相同的结构,当然同样的VCS。

如果你想进行一些配置/插件版本,它应该用于其他项目,也比依赖使一个独立的企业pom.xml是一个独立的项目,将另行发布等。

之后你做完结构的变化,你可以简单地去到父-POM目录并mvn clean packagemvn release:prepare release:perform从该文件夹,一切都将更加简单。



Answer 2:

如果你发布你的POM,你就必须释放任何更新,但你并不需要手动修改POM版本 - 你可以自动更新使用插件的版本或发行版本的插件。 我倾向于选择释放插件,因为它会承诺SCM对你来说太。

mvn versions:set 

http://mojo.codehaus.org/versions-maven-plugin/

mvn release:prepare release:perform

http://maven.apache.org/plugins/maven-release-plugin/

您的仓库管理器也可以允许覆盖现有版本,但它是更好的做法,只发布一个新版本。

我倾向于选择扁平模块结构,因为它允许使用父文件夹来存储公共文件例如CheckStyle的配置。 我也觉得有用共享组ID跨模块然后命名模块目录一样的artifactId。



Answer 3:

您呈现矛盾的要求。 你要调整你的项目,但不能走动的东西。 您希望简化部署和发布周期,但不希望使用一个版本。

考虑到一个模块中的变化必然影响到所有相关的模块,我会用一个简单的version'ing方案,其中所有的子模块继承其父的版本。 行家释放:准备和发布周期变得简单。 使用发行说明,以跟踪更改并证明跳过不变模块的不必要的测试(修改版本不改变构建过程的编译/二进制输出,因此您可以使用它作为你的主要论点)。

祝你好运与您的项目。



文章来源: How to restructure Maven multi-module project?