如何使用滑动释放循环正确设置多模块Maven项目

Mar*_*utt 12 java maven-2 intellij-idea

我正在尝试以允许模块的不同发布周期的方式设置我们的多模块Apache Maven项目的最佳方法,并且在调试项目时不会引入依赖性问题.

我们目前的设置方式如下:

  • bigsystem@1.2
    • 父 - 1.1-SNAPSHOT
    • 模块a@1.4-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供资助
    • 模块b@1.3-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供资助
      • 取决于a@1.1
    • module c@1.1-SNAPSHOT
      • 由parent@1.1-SNAPSHOT提供资助
      • 取决于a@1.2
      • 取决于b@1.1

模块b和c中声明的依赖项包含编译模块所需的最低版本,该模块不一定是模块的当前版本,也不是所部署模块的版本.

从构建角度来看,这很有效,每个模块都可以根据需要发布/更新,但是当尝试调试已经打开顶级pom的IntelliJ IDEA(版本8和9 EAP)下部署的应用程序时,IDEA决定,因为我们声明了依赖于a@1.2,只要我们进入其中一个类,就应该从a-1.2-sources.jar而不是项目中当前的a@1.4源打开它.这进一步混淆了这样一个事实,即进入b的任何一个班级都需要我们b = 1.1而不是b@1.3.

我最初尝试解决这个问题是在父pom的dependencyManagement部分中声明版本号,并让子模块继承该版本.这有助于解决IDEA调试问题,因为dependencyManagement部分可以指向每个人当前的-SNAPSHOT版本.

不幸的是,由于必须在释放模块之前释放父pom,因此在执行maven释放时会出现问题,但由于父级可能引用多个开发中-SNAPSHOTS,因此无法释放它,我们最终会添加版本引用到模块pom以满足发布.

似乎使用maven的dependencyManagement部分只有在我们同时发布所有bundle时才会真正起作用,无论它们是否发生了变化,但是因为我们只想在需要时管理每个子模块的版本,这个模型不会似乎很合适.

我怀疑我遗漏了什么,并且dependencyManagement和版本范围的组合可能满足要求,尽管我还没有看到版本范围正常工作.

有没有更好的办法?一个正确的方法?

Mar*_*utt 2

我们最终使用的最终/工作解决方案与我们开始时非常相似。实际的项目结构保持不变:

  • 大系统@1.2
    • 父级 1.1-快照
    • 模块 a@1.4-SNAPSHOT o 以parent@1.1-SNAPSHOT 为父级
    • 模块 b@1.3-SNAPSHOT o 以parent@1.1-SNAPSHOT 为父级 o 依赖于 a@1.1
    • 模块 c@1.1-SNAPSHOT o 以parent@1.1-SNAPSHOT 为父级 o 依赖于 a@1.2 o 依赖于 b@1.1
    • 分发a@1.2-SNAPSHOP

但主要区别在于:

  • 父模块不包含任何版本的项目工件
  • 各个模块完全声明其项目依赖项并指定版本范围,即 [1.0.0,1.1.0)
  • 所有模块都从 .1 开始版本号循环,即 1.0.1-SNAPSHOT,这允许初始快照满足版本范围(1.0.0-SNAPSHOT 早于 1.0.0 最终版本,因此不包括在内)。
  • 分发 pom(最初未在问题中显示)标识要部署/包含在特定版本中的确切版本。
  • 发布时从本地 Maven 存储库中删除所有项目 -SNAPSHOTS,以便仅范围拾取版本(或使用 -Dmaven.repo.local=/tmp/sometemprepo 获取新的本地存储库)

这使得每个模块更加独立,并让我们可以自由地发布和部署项目工件的新版本,而无需大惊小怪。