如何指定 maven 的分布管理组织范围?

2022-08-31 08:37:47

我试图弄清楚如何组织许多(大约50多个)maven2项目,以便它们可以部署到中央nexus存储库中。使用目标时,确实需要在 distributionManagement 标记中指定目标,如下所示:mvn deploy

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

现在,我不希望每一个pom.xml(50 +)一遍又一遍地包含这个块。我的第一个是文件,但似乎不可能(通过设计)在那里定义它。那么,第一个问题是,为什么会这样?如果可能的话,我可以在设置中指定它.xml maven2发行版中,它可以分发给所有开发人员。settings.xml

我发现的唯一可能的解决方案是创建一个组织范围的master-pom项目,其中包含这些设置,并使所有其他pom.xml依赖于这个master-pom via标签。但这在多模块构建中看起来有点奇怪:<parent>

- 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,而不是一些不同的。但是在阅读了关于继承v的maven网站之后。聚合 它写道,它确实是可能的。

我发现的一个问题是maven站点生成,它似乎确实存在此设置问题(如果模块没有直接的反向引用,则模块无法正确链接)

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


答案 1

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

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

使用此结构执行的操作是将父模块包含在聚合器中,并使用根目录构建所有内容。mvn install

我们在我的组织中使用这个精确的解决方案,它经受住了时间的考验,对我们来说效果很好。


答案 2

不需要父 POM。

您可以在pom中完全省略分发管理部分,并在构建服务器或设置中设置它.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,了解可以设置哪些选项。

也可以在设置中设置此项.xml

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

示例设置.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>

确保“快照”和“发布”的凭据位于设置部分.xml<servers>

属性 altSnapshotDeploymentRepository 和 altReleaseDeploymentRepository 是 maven-deploy-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>

推荐