我试图弄清楚如何组织许多(大约 50 多个)maven2 项目,以便它们可以部署到中央 nexus 存储库中。使用 mvn deploy
目标时,确实需要在 distributionManagement 标签中指定目标,如下所示:
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
现在,我不希望每一个 pom.xml(那 50 多个)一遍又一遍地包含这个块。我的第一个虽然是 settings.xml
文件,但似乎不可能(按设计)在那里定义它。所以,第一个问题是,为什么会这样?如果可能的话,我可以在 maven2 发行版的 settings.xml 中指定它,它可以分发给所有开发人员。
我发现的唯一可能的解决方案是创建一个组织范围的 master-pom 项目,它确实包含这些设置,并通过 <parent>
标签使所有其他 pom.xml 依赖于这个 master-pom。但这在多模块构建中看起来有点奇怪:
- master configuration POM (pm)
- Project 1 parent pom (p1 with module 1 and module 2 as modules)
- Project 1 module pom (with pm as parent)
- Project 2 module pom (with pm as parent)
通常我在所有文档中读到模块 poms 应该使用父 pom,而不是一些不同的。但是在阅读了有关Inheritance v. Aggregation 的maven 网站后,它写道它确实是可能的。
我发现的一个问题是 Maven 站点生成,这个设置似乎确实有问题(如果模块没有直接的反向引用,则模块无法正确链接)
那么,这是一种有效的方法吗?任何其他更明显,更简单的问题解决方案?
原文由 mglauche 发布,翻译遵循 CC BY-SA 4.0 许可协议
最好的解决方案是为您组织中的所有项目创建一个简单的父 pom 文件项目(带有包装“pom”)。
这可以被构建、发布和部署到您的本地 nexus,这样每个人都可以访问它的工件。
现在对于您希望使用它的所有项目,只需包含此部分:
该解决方案将使您能够轻松地将其他常用内容添加到您公司的所有项目中。例如,如果您想将 JUnit 的使用标准化为特定版本,这将是您的最佳选择。
如果你有使用多模块结构的项目,它们有自己的父模块,Maven 也支持链接继承,所以让你的项目的父 pom 文件引用你公司的父 pom 并且让项目的子模块甚至不知道你的是完全可以接受的公司的母公司。
我从您的示例项目结构中看到您正试图将您的父项目与您的聚合器 pom.xml 放在同一级别。如果您的项目需要自己的父级,我发现的最佳方法是将父级包含在与其余模块相同的级别,并将聚合器 pom.xml 文件放在所有模块目录所在的根目录下。
你对这个结构所做的是将你的父模块包含在聚合器中,并使用根目录中的
mvn install
构建所有内容。我们在我的组织中使用了这个精确的解决方案,它经受住了时间的考验,对我们来说效果很好。