Maven 发布插件失败: 源代码工件被部署了两次

我们正在 Hudson 上使用 maven 发布插件,并尝试自动化发布过程。 发布: 准备工作良好。当我们尝试执行发布: 执行时,它失败了,因为它尝试将源工件上传两次到存储库。

我尝试过的事情,

  1. 删除的配置文件,其中包括专家源插件从超级聚会(没有工作)
  2. 将 Hudson 的目标指定为-P。我认为这将排除源插件被执行。(没有工作)。
  3. 尝试指定插件阶段的一些不存在的阶段在超级。(没有工作)
  4. 尝试指定插件配置,forReleaseProfile 为 false

它仍然吐出这个错误。

[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Checking for pre-existing User-Agent configuration.
[INFO] [DEBUG] Adding User-Agent configuration.
[INFO] [DEBUG] not adding permissions to wagon connection
[INFO] Uploading: http://xx.xx.xx.xx:8081/nexus/content/repositories/releases//com/yyy/xxx/hhh/hhh-hhh/1.9.40/hhh-hhh-1.9.40-sources.jar
[INFO] 57K uploaded  (xxx-xxx-1.9.40-sources.jar)
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [DEBUG] Checking for pre-existing User-Agent configuration.
[INFO] [DEBUG] Adding User-Agent configuration.
[INFO] [DEBUG] not adding permissions to wagon connection
[INFO] Uploading: http://xx.xxx.xx.xx:8081/nexus/content/repositories/releases//com/xxx/xxxx/xxx/xxx-xxx/1.9.40/xxx-xxx-1.9.40-sources.jar
[INFO] [DEBUG] Using Wagon implementation lightweight from default mapping for protocol http
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [ERROR] BUILD ERROR
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Error deploying artifact: Authorization failed: Access denied to: http://xx.xxx.xx.xx:8081/nexus/content/repositories/releases/com/xxx/xxx/xxx/xxx-config/1.9.40/xxx-xxx-1.9.40-sources.jar

如果有任何帮助,我们将不胜感激。

43468 次浏览

我不认为问题是在发布插件,我认为你有 xxx-sources.jar连接两次-这就是为什么重复上传。为什么有一个重复的附件是很难说不看到 POM。尝试运行 mvn -X并另一次检查附加 xxx-source.jar的用户的日志。

在任何情况下,Nexus 的一个很好的解决方案就是有一个临时仓库,在那里你可以多次上传发布版本——当一切准备就绪时,你只需关闭/促进临时回购。以 索纳类型 OSS 设置为例。

我使用 release aseProfile = false 配置了 maven 发布插件,并且不执行源工件概要文件。

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
<configuration>
<arguments>-P!source-artifacts</arguments>
<useReleaseProfile>false</useReleaseProfile>
<goals>-Dmaven.test.skip=true deploy</goals>
</configuration>
</plugin>
</plugins>
</build>

试试运行 mvn -Prelease-profile help:effective-pom。 您将发现 maven-source-plugin有两个执行部分

输出如下:

    <plugin>
      <artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

要解决这个问题,找到所有使用过 maven-source-plugin的地方,并确保使用“ id”附加源,以便它与发布配置文件相同。然后这些部分将被合并。

最佳实践表明,为了获得一致性,您需要在项目的根 POM 中配置这个,在 build > pluginManagement 中,在子 POM 中配置 没有。在子 pom 中,您只需在 build > plugins 中指定希望使用 maven-source-plugin,但不提供执行。

在根 pom.xml 中:

<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<!-- This id must match the -Prelease-profile id value or else sources will be "uploaded" twice, which causes Nexus to fail -->
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>

在子 pom.xml 中:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
</plugins>
</build>

只是遇到了同样的问题,我分析了一下。mvn release:perform计算 release. properties 文件,然后检出临时目录中的标记,并在其中调用类似于

/usr/bin/mvn -D maven.repo.local=... -s /tmp/release-settings5747060794.xml
-D performRelease=true -P set-envs,maven,set-envs deploy

我尝试复制这个命令——手动检查由 release:prepare生成的标记并调用:

mvn -D performRelease=true -P set-envs,maven,set-envs deploy

我得到了相同的结果: 它试图上传-source. jar 两次。

正如 合格在注释中指出的,设置 performRelease=false会省略同一个文件的两个附件中的一个。

我真的不知道 部署插件(或任何其他插件)是如何使用这个属性的。

我们可以提供这个参数作为 maven-release-plugin 的配置:

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<useReleaseProfile>false</useReleaseProfile>
</configuration>
</plugin>
</plugins>
</build>

我现在将 <useReleaseProfile>false</useReleaseProfile>行添加到所有 POM 中,看起来现在发布没有错误消息也可以工作了。

我也有同样的问题。基本上,当一个工件被发送到 Nexus 两次时,就会发出错误消息。这可能是同一个 Nexus 存储库的两次,甚至是同一个 Nexus 中不同存储库之间的两次。

然而,这种错误配置的原因可能有所不同。在我的例子中,工件在 Jenkins 的 mvn clean 部署构建步骤中正确上传,但是在尝试第二次部署时失败。第二个部署是在 Jenkins 后期构建步骤“在 Maven 存储库中发布工件”中配置的。

我一直在这个问题上挣扎了一段时间,最终在我们的基础设施中解决了这个问题。这里的答案对我没有帮助,因为我们没有多次执行源插件的目标,而且配置对我们来说看起来很好。

我们错过的是将源插件的执行绑定到一个阶段。通过 Bae 扩展示例,包括行 <phase>install</phase>到执行,为我们解决了这个问题:

<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
<executions>
<execution>
<id>attach-sources</id>
<phase>install</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

我怀疑解决方案就在这个答案 给你中; 不同的插件似乎都在调用 jar 目标/附加源的执行。通过将我们的执行绑定到某个阶段,我们强制我们的插件只能在这个阶段运行。

父代和子代 poms 中的 Maven 插件不应该执行。根据标准约定,在插件管理部分的父级 pom 中定义所有具有执行/目标的插件。子 pom 不应该重新定义上面的细节,而应该只提到需要执行的插件(带有 artifactId 和版本)。

我对 maven-Assembly-plugin 的父 pom 也有类似的问题,如下所示:

<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptors>
<descriptor>src/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>

Child pom 的 maven-Assembly-plugin 如下:

<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-5</version>
<configuration>
<finalName>xyz</finalName>
<descriptors>
<descriptor>src/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>xyz-distribution</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

从子 pom 中删除 <executions>纠正了这个问题。 有效的 POM 执行了2次,导致重复安装到 Nexus repo。

我知道这个问题已经很老了,但是今天它是 google hit # 1,所以我将为 Maven3的最新版本添加我的答案。

其症状是,在使用某些版本的 maven3进行发布版本构建时,源代码和 javadoc jar 被部署了两次。如果您使用 maven 将工件部署到 Sonatype Nexus 存储库,该存储库只允许上传一次发布工件(这是完全合理的行为) ,那么当第二次上传尝试被拒绝时,构建将失败。啊!

Maven 版本3.2.3到3.3.9都有 bug-参见 https://issues.apache.org/jira/browse/MNG-5868https://issues.apache.org/jira/browse/MNG-5939。这些版本在发布时会生成和部署源代码和 javadoc jar 两次。

如果我正确地阅读了 Maven 问题跟踪器,那么在撰写本文时,这些 bug 并没有被安排修复(烧毁的3.4.0版本可能会影响这些问题)。

我的简单解决方案是回到 Maven 版本3.2.1,而不是对我的 pom 进行复杂的调整。

FWIW 这个问题打破了我们的构建一段时间,答案是没有上述。 相反,我愚蠢地将貌似无关紧要的附件 AssemblyId 设置为与我们的主工件相连接(读取部署,发布)的工件的 maven-Assembly-plugin 中的 false。例如:

    <execution>
<id>ci-groovy-distrib</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorRefs>
<descriptorRef>my-extra-assembly</descriptorRef>
</descriptorRefs>


<!-- This is the BUG: the assemblyID MUST be appended
because it is the classifier that distinguishes
this attached artifact from the main one!
-->
<appendAssemblyId>false</appendAssemblyId>
<!-- NOTE: Changes the name of the zip in the build target directory
but NOT the artifact that gets installed, deployed, releaseed -->
<finalName>my-extra-assembly-${project.version}</finalName>
</configuration>
</execution>

总之:

  1. 汇编插件使用 AssemblyId 作为工件的 分类器,因此它的唯一 GAV 坐标的一个重要组成部分(实际上它更像 GAVC 坐标-C 是分类器)。

  2. 文件 安装部署释放的名称实际上是从这些坐标构建的。是 与您在目标目录中看到的文件名不同。这就是为什么您的本地构建看起来很好,但是您的发布将会失败。

  3. 愚蠢的元素只确定本地构建工件的名称,并不参与其余部分。这完全是转移视线。

摘要摘要: Nexus 的400错误是因为我们额外附加的工件被上传到了主工件的上方,因为它和主工件有着相同的名字,因为它和主工件有着相同的 GAVC 坐标,因为我删除了唯一的区别坐标: 从 Assembly blyId 自动派生的分类器。

调查发现这是一条漫长而曲折的道路,答案一直都在文档中:

附录

  • 布尔型

  • 设置为 false 以排除程序集 id 从程序集最终名称,并创建结果程序集 因此,具有 与当前 Maven 项目的打包格式相同 这个主项目工件的文件 。

  • 默认值为: true。
  • 用户属性是: Assembly。

来自 http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html#attach

特别大胆的是我的。医生应该在这里有一个大的闪烁警告: “设置为假,并放弃所有的希望”

关于另一个问题,我从这个答案中得到了一些帮助 来自 Tunaki 的解释真的很有帮助。

这是我跑步的时候发生的事

mvn install deploy

我用跑来避免这个问题

mvn deploy

(这意味着安装)。在我的例子中,只有一个工件被尝试上传两次,那就是第二个工件(maven-jar-plugin 被设置为除了由 default-jar 执行构建的工件之外,还构建一个第二个 jar)。

DR

使用 id attach-sources禁用执行可以解决这个问题,如果您不能修改您的父 poms。

--

这个回答是对@Bae 的回答的补充:

Https://stackoverflow.com/a/10794985/3395456

我的问题是相同的,当运行 mvn -Prelease-profile help:effective-pom时,我有两个用于 maven-source-plugin 的执行部分

<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.0.4</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
<execution>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>

最受欢迎的答案只是推荐了一个删除未命名(匿名) execution以避免重复绑定的最佳实践。但是,如果我不能删除它,因为我不能改变父绒球?

有一种方法可以禁用一个 execution,不是匿名的,而是 ID 为 attach-source的那个。它也可以上传 xx-javadoc.jar两次。

因此,在我的 pom.xml下,我可以通过使用 id attach-source禁用执行来显式覆盖插件设置。

  <!-- Fix uploading xx-source.jar and xx-javadoc.jar twice to Nexus -->
<!-- try to disable attach-sources, attach-javadocs execution (bind its phase to none) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>none</phase>
</execution>
</executions>
<inherited>true</inherited>
</plugin>

参考文献: 是否有可能在 maven pluginManagement 中覆盖执行?

我遇到过类似的问题,工件被部署了两次,结果构建失败了。

检查并发现问题出现在 Jenkins Script 中:

Sh“ mvn-s setings.xml clean 鼻子部署-s setings.xml 部署-U ... ..。

导致了这个问题。 更新了这句话,效果非常好:

Sh“ mvn clean department-s setings.xml-U ... ..。

连接器的配置为我工作

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<useReleaseProfile>false</useReleaseProfile>
</configuration>
</plugin>