【发布时间】:2011-07-26 05:58:14
【问题描述】:
关于 Maven 的一些可行性问题。特别是,我们是否可以在聚合 pom 中定义属性,然后将它们注入到引用的模块中,从而允许该模块在本地覆盖继承层次结构中定义的默认属性。
如果您对细节感兴趣,我将描述我的设置。不过,在此之前,我只想说,我们已经作为一个团队广泛讨论了我们的项目结构,它非常适合我们的需求。我们目前不是在寻找其他结构的建议,而是专门探索 maven 是否可以满足我们的需求。
所以,我们的设置;我会把它归结为要点。我们有两个源项目,A 和 B。它们中的每一个实际上都是另一个的子模块,分别是 ParentA 和 ParentB。 ParentA 和 ParentB 在技术上具有许多子模块,但在此示例中,为了简单起见,我将仅显式引用一个。到目前为止,一切都很好。 ParentA 引用 A 作为子模块,A 引用 ParentA 作为其父模块。 B 和 ParentB 之间也有同样的关系。
现在乐趣来了。我们希望 ParentA 和 ParentB 都有一个超级父 pom 来继承共享属性和配置,例如依赖管理和插件等。但是我们不希望这个超级父 pom 负责构建。相反,我们想定义一些有选择地构建各种模块的构建项目。在本例中,我将介绍 BuildAB 和 BuildB。第一个构建 A,然后构建 B,而第二个构建 B。实际上,我们有很多这样的交错模块组和依赖项。最后,只是为了完成图片,我们有一个从 B 到 A 的依赖关系。
让我试着用一些 ascii 艺术来画这个;)
继承
A --> ParentA --> parent
B --> ParentB --> parent
子模块关系
BuildAB ==> { (ParentA ==> A) (ParentB ==> B) }
BuildB ==> (ParentB ==> B)
依赖关系
B > A
现在,不可能使用 BuildAB 和 BuildB 文件中的属性来定义依赖关系;这些构建文件不是任何继承树的一部分,因此不会获取任何属性。但是我们确实希望在运行 BuildAB 和 BuildB 时以不同的方式控制依赖版本;简单地将依赖项放在超父级中并不能满足我们的要求。
如果您想知道为什么这可能是考虑到一个团队可能正在开发 B 模块,并且还可能对 A 进行少量修改。其他开发人员可能正在为项目 A 开发最新和最伟大的项目,由于依赖关系,该项目对 B 产生了影响。多亏了 Mercurial,我们有很好的机制在源代码中处理这个问题。但是我们真的很难用 Maven 来完成这项工作。
理想情况下,每个构建文件首先会依赖从父级继承的子模块。但是当我们需要重写这个继承时,我们希望能够在 Build 文件中指定可注入的属性,这就像它们最初在模块中指定的一样。当然,所有这些都无需实际修改受源代码控制的 pom。
我们想要评估的是是否有任何范围可以通过插件或补丁修改 maven 来做到这一点。
我们以前从未编写过插件(坦率地说,关于这方面的教程和在线资料很少,而且对开发人员并不友好 - 除非有人有我错过的好教程 :))但我们愿意提供如果可行就试试看。
所以,基本上,
- 您之前是否自己处理过类似的要求并使其与现有插件一起使用?
- 我们是否缺少一个简单的技巧?
- 你有没有写过类似的插件,可以推荐一个开始的地方吗?
- 您知道此类插件可能无法正常工作的任何实际原因吗?
- 您是否在处理 maven 源代码并知道我们是否可以提供任何生成的代码...以及如果我们愿意,我们应该从哪里开始寻找。
最后一条评论。我们在 Eclipse 中开发,因此我们还需要构建在没有属性注入的情况下工作。我希望这将通过正常的继承树。
非常感谢大家,我知道这是一个有点棘手的问题。
【问题讨论】:
-
如果我正确理解您的意愿,我看不到 maven 的方法,但我必须说这对我来说听起来有点奇怪。在我看来,通过注入属性对依赖项进行这种更改的可能性会使构建变得不可靠。
-
关于可靠性的要点。我们确实花了一些时间考虑这显然非常重要。由于我们不是从继承层次结构 pom 触发构建,而是始终从负责注入的聚合 pom 触发构建,因此每个构建每次都会以相同的方式运行。
标签: inheritance properties maven aggregate multi-module