如何指定整个Maven的DistributionManagement组织?


110

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

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

现在,我不希望所有的50个以上pom.xml都包含一遍又一遍。虽然我的第一个settings.xml文件是文件,但似乎无法(通过设计)在此处定义文件。因此,第一个问题是,为什么会这样呢?如果可能的话,我可以在maven2发行版的settings.xml中指定它,该发行版可以分发给所有开发人员。

我发现的唯一可能的解决方案是创建一个组织范围的master-pom项目,该项目确实包含这些设置,并使所有其他pom.xml通过<parent>tag 依赖于此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网站生成,该设置似乎确实存在问题(如果模块没有直接的反向引用,则无法正确链接)

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



5
@OhadR:他们只写如何在一个项目中编写它。问题是我不想重复约500次...
mglauche 2014年

1
我懂了。点。因此,正如回答的人所说,您可以为该项目创建一个主pom,其中将包含“ distribMngmnt” ...
OhadR 2014年

Answers:


144

最好的解决方案是为组织中的所有项目创建一个简单的父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根目录中的来构建所有内容。

我们在我的组织中使用了这种精确的解决方案,它经受了时间的考验,并且对我们来说运作良好。


这是另一个答案,在这里我将更详细地描述项目继承,以及如何管理它的继承复杂性。;)stackoverflow.com/questions/6347913
Jesse Webb

7
只是小记:对于原因为何该公司母公司是最好的解决方案,请参阅的讨论不能在settings.xml中指定distributionManagement从Maven的用户列表。
Premek Brada

在经典的咨询模型中,“客户拥有代码”,我的开发团队将需要在项目外工作,然后将最新代码带到客户现场并重新构建。在我的情况下,使用多模块项目,如果我在项目上级POM中引用了公司POM,则必须更新该引用以指向客户的公司POM。如果可以的话,我宁愿努力在settings.xml中维护所有特定于环境的设置。对于我的情况,推荐的方法是什么?
网络用户

2
@WebUser您的问题听起来更像是一种情况,您需要在POM文件中使用不同的值,而不是此答案所解决的问题:避免在多个模块中重复设置。我认为您应该尝试通过settings.xml文件注入属性。如果这样做没有帮助,请在SO上提出一个新问题,并在此处链接到该问题,我将尝试进一步为您提供帮助。
Jesse Webb

谢谢@JesseWebb,我确实尝试了一下,对于我所描述的情况,将这些值从POM中抽象出来很有用。为了我的需要,我在活动配置文件下添加了相关属性,并在POM中解决了这些属性。
网络用户

36

不需要父POM。

您可以完全省略poms中的distributionManagement部分,并在构建服务器或settings.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

只需在此处创建一个已启用并包含该属性的配置文件即可。

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

确保“ snapshots”和“ releases”的凭据在<servers>settings.xml 的部分中

Maven-deploy-plugin 2.8版引入了属性altSnapshotDeploymentRepository和altReleaseDeploymentRepository。旧版本将失败并显示错误消息

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>

我一直在尝试此解决方案,但只有altDeploymentRepository属性有效。无法识别altReleaseDeploymentRepositoryaltSnapshotDeploymentRepository,并且出现此错误:部署失败:未在distributionManagement元素内的POM或-DaltDeploymentRepository = id :: layout :: url参数中指定存储库元素。任何建议都会有所帮助。谢谢
Shabirmean

@Shabirmean原因是部署插件的版本太旧。我用解决方案扩展了答案。
Michael Wyraz

是的,我知道了。非常感谢您:)
Shabirmean
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.