具有不同子版本的maven父pom

标签 maven

我们的应用程序中有多个模块,每个模块都有各自的版本并依赖于其他模块(我们组织外部)。他们都有一个父 POM,它有自己的版本,独立于子版本。

当其中一个模块发生更改时,它们将转换为快照。

对于以下示例:

Parent v14.0
- module1 v1.5.0
    - dependency1(module2 v15.0.0)
    - dependency2(external-jar v12.0.1)
- module2 v15.0.0
- module3 v3.1.0

如果 module2 发生变化,则 module2 的版本将变为 v15.0-SNAPSHOT,然后 module1 变为 v1.5-SNAPSHOT。父级保持不变。
在 parent+modules 上没有相同版本的目的是我们希望本地化对某些模块所做的更新而不影响其他模块的版本。

很久以前就是这样设计的,并且有几个 bash 脚本来支持更新,尽管它们并没有处理所有情况。无论如何,我们没有一键发布流程,我们觉得我们离这种方法还很远。

我们不知道如何说服管理层采用所有模块的单一版本方法。您对以上内容有何感想?你有没有遇到过使用上述结构的项目,它进展得如何?

谢谢!

最佳答案

我以前不得不处理这种情况。拥有去中心化版本确实有好处,尤其是在您的产品由大量模块组成的情况下,这是因为以下事实:

  • 如果只更改了少数几个(根据我的观察,几乎总是如此),您不必将它们全部发布。
  • 对于自上一版本以来未更改的代码,您不必在版本控制中创建不必要的标签。
  • 您不必浪费过多的时间来发布不需要发布的模块。
  • 您可以确定地知道版本中哪些模块发生了更改,这在您需要调查似乎可以追溯到一段时间前的复杂错误时很有帮助。
  • 您实际上可以在完整产品的实际发布日期之前发布某些模块/聚合器,从而为产品的给定部分留出更多的测试时间和完整感。
  • 您可以更轻松地发布功能分支,并以更好的方式实现持续交付。
  • 您可以在多个开发分支中重复使用相同的代码,而无需怀疑该分支版本是否与您的分支匹配(或者至少不会产生混淆)。

  • 我们最终做的是:
  • 提取一个父级或一组父级(没有子模块)。
  • 尽量为家长使用固定版本。这有点警告,因为您必须更改所有继承它的模块,但最终它会提高稳定性。
  • 将版本独立于其他模块的每个模块提取到单独的模块中。
  • 提取版本必须始终一起移动到聚合器的模块集。
  • 在 CI 服务器中创建可以发布或手动发布这些模块的作业。
  • 使用 versions-maven-plugin .

  • 我认为使用分散版本的项目和公司的开发原则要成熟得多,我必须承认,一开始我非常不愿意这种方法。您可能不会立即意识到或理解这些好处,但是通过一些练习和适当的设置,您将开始看到好处。我并不是说没有像...这样的警告,例如提升父级的版本,或者必须知道在哪些模块中提升某个模块的版本。

    根据我的经验,一旦你习惯了使用它,这个模块实际上最终会更好地工作。

    关于具有不同子版本的maven父pom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22529344/

    相关文章:

    java - Spring Boot 应用程序 - 使用参数调用类而不默认运行

    java - 从属 jar 不会部署到 tomcat,其中带有此 jar 的项目在工作区中打开

    Maven WAR <overlays> - 包含 WEB-INF/classes 中的文件

    java - 如何定义对未知模块的合格导出?

    java - maven 上有 bctls (BouncycaSTLe TLS) 吗?

    java - 从 CoreNLP 模型 jar 文件加载特定模型文件而不是其本地副本

    java - 项目转换为maven后JSP类未定义类型

    java - 在 Eclipse 中,Tomcat 6 使用范围为 'provided' 的 javax.servlet-api 3.0.1

    java - java.library.path 中没有 dhtreader

    java - Java(JavaFX): Maven Proguard doesnt obfuscate FX Ids