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

mgl*_*che 105 java deployment maven-2 nexus maven

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

<distributionManagement>
   <repository>
      <id>nexus-site</id>
        <url>http://central_nexus/server</url>
   </repository>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)

现在,我不希望每个pom.xml(50+以上)一遍又一遍地包含这个块.我的第一个虽然是settings.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)
Run Code Online (Sandbox Code Playgroud)

通常我在所有文档中都读到模块poms应该使用父pom,而不是一些不同的pom.但在阅读了关于继承诉聚合的maven网站之后,我们写道它确实是可能的.

我发现的一个问题是maven网站生成,这似乎有这个设置的问题(模块如果没有直接的反向引用就无法正确链接)

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

Jes*_*ebb 139

对此最好的解决方案是为您组织中的所有项目创建一个简单的父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>
Run Code Online (Sandbox Code Playgroud)

这可以构建,发布和部署到您的本地连接,以便每个人都可以访问其工件.

现在,对于您希望使用它的所有项目,只需包含此部分:

<parent>
  <groupId>your.company</groupId>
  <artifactId>company-parent</artifactId>
  <version>1.0.0</version>
</parent>
Run Code Online (Sandbox Code Playgroud)

该解决方案将允许您轻松地将其他常见内容添加到您公司的所有项目中.例如,如果您想将JUnit使用标准化为特定版本,那么这将是最佳选择.

如果您的项目使用具有自己父级的多模块结构,Maven也支持链接继承,因此将项目的父pom文件引用到公司的父pom并让项目的子模块甚至不知道您的完全可以接受公司的母公司.

我从您的示例项目结构中看到,您试图将您的父项目放在与聚合器pom相同的级别.如果您的项目需要自己的父项,我发现的最佳方法是将父项包含在与其余模块相同的级别,并将聚合器pom.xml文件放在所有模块目录所在的根目录下.

- pom.xml (aggregator)
    - project-parent
    - project-module1
    - project-module2
Run Code Online (Sandbox Code Playgroud)

您对此结构所做的是在聚合器中包含您的父模块,并使用mvn install根目录构建所有内容.

我们在我的组织中使用这种精确的解决方案,它经得起时间的考验,对我们来说效果很好.

  • 只是一个小小的注释:由于原因*为什么*公司的父母是最好的解决方案,请参阅讨论[无法在settings.xml中指定distributionManagement](http://maven.40175.n5.nabble.com/Can-来自Maven用户列表的t-specify-distributionManagement-in-settings-xml-td3181781.html). (7认同)
  • 我不知道链接继承,好点! (2认同)
  • @WebUser你的问题听起来更像是你需要在POM文件中使用不同值的情况,而不是这个答案解决的问题:避免跨多个模块的重复设置.我想你应该尝试[通过settings.xml文件注入属性](http://maven.apache.org/examples/injecting-properties-via-settings.html).如果这对您没有帮助,请在此处询问一个新问题,在此处链接到此处,我会尽力为您提供帮助. (2认同)

Mic*_*raz 18

不需要父POM。

您可以完全省略poms中的distributionManagement部分,并在构建服务器或settings.xml中进行设置。

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

-DaltSnapshotDeploymentRepository=snapshots::default::https://YOUR_NEXUS_URL/snapshots
-DaltReleaseDeploymentRepository=releases::default::https://YOUR_NEXUS_URL/releases
Run Code Online (Sandbox Code Playgroud)

有关可以设置哪些选项的详细信息,请参见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>
Run Code Online (Sandbox Code Playgroud)

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

Maven-release-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
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以强制使用较新版本的插件:

        <build>
                <pluginManagement>
                        <plugins>
                                <plugin>
                                        <artifactId>maven-deploy-plugin</artifactId>
                                        <version>2.8</version>
                                </plugin>
                        </plugins>
                </pluginManagement>
        </build>
Run Code Online (Sandbox Code Playgroud)


Rob*_*ton 8

关于Michael Wyraz 的答案alt*DeploymentRepository,您在 或 命令行中使用参数settings.xml,maven-deploy-plugin 版本 3.0.0 中的格式已更改

在值中:

releases::default::https://YOUR_NEXUS_URL/releases
Run Code Online (Sandbox Code Playgroud)

您需要删除该default部分,使其:

releases::https://YOUR_NEXUS_URL/releases
Run Code Online (Sandbox Code Playgroud)