"Child-only configuration" 在父POM中的含义 / NOOP父POM

3
我有一个生成代码的项目。由于生成时间太长,所以我将其分成多个子项目,每个子项目只生成整体的20%。原始的POM成为“父POM”,子项目依赖于它,只包含一个独立的构件ID和一个或两个更改的属性。
我不想“构建父级”,因为这需要太长时间而且太耗费资源。我只想单独构建子项目。因此,在父级中没有“模块”的部分。
现在这个方法可以工作,但是有一个问题:Maven会将子POM放在存储库中,表示它们“依赖于父级”。但实际上,父级本身并不存在。父级从未被执行过,也没有产生任何构件。我甚至无法执行父级,因为它会由于“缺少文件”等原因而失败。构建部分中的插件配置实际上仅适用于子项;对于构建父项来说,没有什么需要做的,因为它实际上并不存在。
我能否删除子构件对(不存在的)父构件的依赖关系, 要么 在构建父级本身时将父POM的整个内容(build/plugins、build/resources和build/pluginManagement)标记为“被忽略”?(希望结果只有一个POM文件存在于本地存储库中)
我想要的是“不带依赖项的重复使用”,但这似乎不可能实现(我不明白为什么;子jar显然没有依赖于父jar,只有子POM依赖于父POM)。
我还看到过从“模板”生成POM的示例(消除依赖关系),但这对我也没有用,因为当“父模板”更改时,我必须重新生成每个子POM。
如果我理解为什么Maven中的POM依赖被硬编码为意味着构件依赖,也许会更合理一些?
用类比的方法来说,当我建造一个狗屋时,我“依赖于”木材和锤子等工具来完成。但是一旦狗屋建造好了,狗屋本身就不再依赖锤子。

我发现我可以通过暂时“清空”父POM来“解决”它,以便它“构建”,并将其安装在Maven仓库中,但这只是一个非常丑陋的hack。 - Sebastien Diot
1个回答

2
您在父级中应该只包含模块、dependencyManagement和build/pluginManagement,您应该通过模块部分引用子模块(如果要构建一个模块,请使用-pl和-am(请参见此处))。您的pluginManagement部分应包含所有插件的公共配置、范围和版本。您的dependencyManagement部分应包含所有依赖项、范围和版本。您的子POM文件不应包含版本,对于与父级不同的依赖关系,应包含依赖关系的范围以及构建特定模块所需的插件。
如果您的情况与此不同,请尝试这样做并查看是否有效,然后请回报问题以进行进一步分析。

今天已经太晚了,但我仍然有一个问题:我读到 pluginManagement 只会影响子模块 如果它们明确声明使用插件(换句话说,在父级中的 pluginManagement 配置不会“移动到 build/plugins” 中的子模块)。假设这是正确的,我仍然需要在子模块的构建部分中声明父级插件(目前我没有这样做)。我的理解正确吗? - Sebastien Diot
我做了一些微小的改动,但它起作用了。我发现将依赖项直接放在父级中不会引起问题,因此我没有将它们放在dependencyManagement中,因为这样需要在子级中重复它们。我将父POM“下一个”移动到子级而不是“在顶部”,这样资源目录也将在父级中有效(相同的目录深度)。它们似乎也不再引起问题了。我希望有一个选项,在子级中根本不提及插件,但artifactId本身就足够“小”。 - Sebastien Diot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接