我正在试图弄清楚如何组织许多(大约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,而不是一些不同的pom。但在阅读了关于继承诉聚合的maven网站之后,我们写道确实有可能。
我发现的一个问题是maven网站生成,这个设置似乎确实存在问题(如果模块没有直接的反向引用,模块就无法正确链接)
那么,这是一种有效的方法吗?还有其他更明显,更简单的解决方案吗?
答案 0 :(得分:135)
最佳解决方案是为您组织中的所有项目创建一个简单的父pom文件项目(包装'pom')。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>
</project>
这可以构建,发布和部署到您的本地关系,以便每个人都可以访问其工件。
现在,对于您希望使用它的所有项目,只需包含以下部分:
<parent>
<groupId>your.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0</version>
</parent>
此解决方案允许您轻松地将其他常见内容添加到公司的所有项目中。例如,如果您想将JUnit使用标准化为特定版本,那么这将是最佳选择。
如果您的项目使用具有自己父级的多模块结构,Maven也支持链接继承,因此将项目的父pom文件引用到公司的父pom并使项目的子模块不均匀是完全可以接受的。了解贵公司的母公司。
我从您的示例项目结构中看到您试图将您的父项目放在与聚合器pom相同的级别。如果您的项目需要自己的父项,我发现的最佳方法是将父项包含在与其余模块相同的级别,并将聚合器pom.xml文件放在所有模块目录所在的根目录下。< / p>
- pom.xml (aggregator)
- project-parent
- project-module1
- project-module2
您对此结构的处理方式是将您的父模块包含在聚合器中,并使用根目录中的mvn install
构建所有内容。
我们在我的组织中使用这个精确的解决方案,它经得起时间的考验,对我们来说效果很好。
答案 1 :(得分:5)
不需要父POM。
您可以完全省略poms中的distributionManagement部分,并在构建服务器或settings.xml中进行设置。
要在构建服务器上执行此操作,只需传递到mvn
命令:
-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/releases
有关可以设置哪些选项的详细信息,请参见https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html。
还可以在您的settings.xml
中进行设置。
只需在此处创建一个已启用并包含该属性的配置文件即可。
示例settings.xml:
<settings>
[...]
<profiles>
<profile>
<id>nexus</id>
<properties>
<altSnapshotDeploymentRepository>snapshots::default::https://YOUR_NEXUS_URL/snapshots</altSnapshotDeploymentRepository>
<altReleaseDeploymentRepository>releases::default::https://YOUR_NEXUS_URL/releases</altReleaseDeploymentRepository>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
确保“快照”和“发行版”的凭据位于settings.xml的<servers>
部分中
答案 2 :(得分:0)