[英]How do I properly setup a multi-module Maven project with sliding release cycles
我正在尝试以允许模块的不同发布周期的方式设置我们的多模块Apache Maven项目的最佳方法,并且在调试项目时不会引入依赖性问题。
我们目前的设置方式如下:
模块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和版本范围的组合可能满足要求,尽管我还没有看到版本范围正常工作。
有没有更好的办法? 一个正确的方法?
我建议不要制作模块,但要让它们的POM独立。 这样您就不必担心尝试满足父POM依赖项。 由于它们是独立发布的,因此它们应该具有独立的项目对象模型。 将Apache Commons视为模板。
我认为IDEA的问题出现是因为您在源结构中使用根POM来做两件通常在Maven中互斥的事情。 您首先使用POM作为存储不相关(从构建角度)Maven项目的公共配置信息的位置。 其次,您使用POM作为构建的聚合器。 您可以在不执行其他操作的情况下执行这些操作。
像Rob说的那样,从父POM的模块部分删除模块a,b等项目。 其次,将您的父POM移动到它自己的目录中,因为它实际上是构建和发布过程中其他模块的兄弟。 现在的方式,它更像是父/聚合器。
现在你拥有它的方式也不适合单独标记和释放每个模块,因为你父POM的标记可能会不必要地包含所有模块子文件夹。
您的文件结构如下所示:
至于你缺少的东西,dependencyManagement不太适合管理项目内依赖项的版本。 这是聚合构建中的模块之间的依赖关系。 它更适合声明外部依赖项的全局版本。
我们最终使用的最终/工作解决方案与我们的开始时非常相似。 实际的项目结构保持不变:
但主要区别在于:
这使得每个模块更加独立,并且让我们可以自由地发布和部署项目工件的新版本,而不用担心。
它们看起来像是单独的模块。 如果它们具有不同的依赖关系,即使在多模块项目中,通过将它们粉碎在一起会获得什么好处?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.