如何在整个管理组织范围内指定 Maven 的分销?

我试图弄清楚如何组织许多(大约50多个) maven2项目,以便它们能够部署到一个中央连接库中。在使用 mvn deploy目标时,确实需要像下面这样在 distribution tionManagement 标记中指定目标:

<distributionManagement>
<repository>
<id>nexus-site</id>
<url>http://central_nexus/server</url>
</repository>
</distributionManagement>

现在,我不希望每一个 pom.xml (超过50个)一遍又一遍地包含这个块。我的第一个想法是 settings.xml文件,但似乎不可能(按设计)在那里定义它。 第一个问题是,为什么会这样?如果可能的话,我可以在 maven2发行版的 setings.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)

通常我在所有的文档中都会读到模块 pom 应该使用父 pom,而不是其他的。但是在阅读了有关“继承诉聚合”的专业网站后,有人写道,这确实是可能的。

我发现的一个问题是与 maven 站点生成,这似乎与这个设置有问题(模块不能得到正确的链接,如果他们没有直接的反向引用)

那么,这是一种有效的方法吗? 还有其他更明显、更简单的解决方案吗?

145425 次浏览

最好的解决方案是为组织中的所有项目创建一个简单的父 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.xml 文件放在所有模块目录所在的根目录中。

- pom.xml (aggregator)
- project-parent
- project-module1
- project-module2

这种结构的作用是将父模块包含在聚合器中,并从根目录构建所有具有 mvn install的内容。

我们在我的组织中使用这种精确的解决方案,它经受住了时间的考验,对我们非常有效。

不需要父母 POM。

您可以在 poms 中完全省略 distribution tionManagement 部分,并在构建服务器或 setings.xml 中设置它。

要在构建服务器上执行此操作,只需传递到 mvn命令:

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases

有关可以设置哪些选项的详细信息,请参阅 https://maven.apache.org/plugins/maven-deploy-plugin/deploy-mojo.html

也可以在 settings.xml中设置这个值。

只需在那里创建一个已启用并包含属性的配置文件。

示例 setings.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>

确保“快照”和“发布”的凭据在 setings.xml 的 <servers>部分中

属性 altSnapshoDeploymentRepository 和 altReleaseDeploymentRepository 是在 maven-department-plugin 2.8版本中引入的

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

为了解决这个问题,您可以强制使用该插件的新版本:

        <build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8</version>
</plugin>
</plugins>
</pluginManagement>
</build>

关于 Michael Wyraz 提供的 回答,其中在 settings.xml或命令行中使用 alt*DeploymentRepository参数,maven-department-plugin 的3.0.0版本中的格式已经发生了变化

价值:

releases::default::https://YOUR_NEXUS_URL/releases

你需要移除 default部分,使其:

releases::https://YOUR_NEXUS_URL/releases