同时将工件部署到 Maven Central 和内部 Nexus

Posted

技术标签:

【中文标题】同时将工件部署到 Maven Central 和内部 Nexus【英文标题】:Simultaneously deploy artifact to Maven Central and internal Nexus 【发布时间】:2015-05-29 20:36:14 【问题描述】:

我有一个项目,该项目使用 Maven releasenexus-staging-maven 插件,使用来自 http://central.sonatype.org/pages/os-s-rh-guide.html 和 http://central.sonatype.org/pages/apache-maven.html 的指示,通过 Os-s-rH 部署到 Maven Central。

这工作正常,但工件通常需要几个小时才能在 Maven Central 上显示。通常我们希望立即使用已部署的工件,因此我们最终使用 deploy:deploy-file 将其从本地存储库部署到我们的内部 Nexus 服务器。这可行,但不优雅且容易忘记做。作为发布过程的一部分,有没有办法让 Maven 部署到内部 Nexus 以及 Maven Central?

注意:这个问题与https://***.com/questions/29019682/promote-artifact-from-internal-nexus-repository-to-maven-central类似,但又不完全相同

【问题讨论】:

六年后,我也面临同样的问题。如果我在其他地方找到解决方案,我会在此处链接。 我找到了解决方案,并在下面提供了答案:***.com/a/70207242/7121505 【参考方案1】:

maven-deploy-plugin添加额外的执行:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-deploy-plugin</artifactId>
  <version>$maven.deploy.plugin.version</version>
  <executions>
    <execution>
      <id>nexus-deploy</id>
      <phase>deploy</phase>
      <goals>
        <goal>deploy</goal>
      </goals>
      <configuration>
        <altDeploymentRepository>yourNexusRepo</altDeploymentRepository>
      </configuration>
    </execution>
  </executions>
</plugin>

yourNexusRepo 值将如下所示:

releases::default::https://nexus.host.org/nexus/content/repositories/releases

您应该能够从 Nexus 获取准确的 URL。第一个 :: 之前的部分是存储库 ID。

【讨论】:

感谢您的回复。我试过了,但没有用 - 它只部署到 Maven Central,并没有尝试部署到我的本地 Nexus。我怀疑这是由于发布插件如何进行部署。 我们使用此配置部署到同一个 Nexus 实例中的两个不同的发布存储库,所以我知道它适用于某些情况。查看调试输出以确保两个执行都在实际运行,或者查看发生了什么可能会很有趣。我们不使用 nexus staging 插件,所以这是一个区别。【参考方案2】:

我们不再使用nexus-staging-maven-plugin 作为扩展解决了这个问题。这在https://help.sonatype.com/repomanager2/staging-releases/configuring-your-project-for-deployment 中有描述:

如果需要对插件部署目标的时间进行更多控制 已激活或如果使用 Maven 2,则必须显式停用 Maven Deploy 插件并替换 Maven Deploy 插件调用 使用 Nexus Staging Maven 插件...

在我们的例子中,我们通过设置 &lt;phase&gt;none&lt;/phase&gt; 禁用了 default-deploy 执行。我们的完整解决方案可在https://github.com/newmediaworks/nmw-oss-parent/commit/a7377a158feded473cb2f1618449e34173c22252 获得,其中包括在jenkins-deploy 配置文件中额外执行maven-deploy-plugin

关键要点如下,到目前为止,它的行为似乎就像启用了扩展一样,但不会干扰额外的 maven-deploy-plugin 执行:

<plugins>
    <plugin>
        <groupId>org.sonatype.plugins</groupId><artifactId>nexus-staging-maven-plugin</artifactId>
        <!--
        Not using as extension, since it blocks maven-deploy-plugin in the jenkins-deploy profile:
        <extensions>true</extensions>
        -->
        <executions>
            <execution>
                <!-- Manually added since nexus-staging-maven-plugin is not used as extension -->
                <id>default-deploy</id><phase>deploy</phase><goals><goal>deploy</goal></goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId>
        <executions>
            <execution>
                <!-- Manually disabled since nexus-staging-maven-plugin is not used as extension -->
                <id>default-deploy</id><phase>none</phase>
            </execution>
        </executions>
    </plugin>
</plugins>

【讨论】:

以上是关于同时将工件部署到 Maven Central 和内部 Nexus的主要内容,如果未能解决你的问题,请参考以下文章

将 kotlin 多平台库发布到 Maven Central(InvalidMavenPublicationException 多个工件具有相同的......)

由于没有 Java 代码或资源,如何使用空的 javadoc jar(或空的源 jar)将工件上传到 Maven Central?

SBT 与 Maven Central - 在工件 url 中摆脱 Scala 版本

从 Maven Central 动态链接到最新的“jar-with-dependencies”

使用 gradle 在 maven Central 上关闭和释放工件

Maven 包签名或您如何信任/验证 Maven Central 工件的完整性和真实性?