72

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

我尝试过的事情,

  1. 从超级 pom 中删除包含 maven 源插件的配置文件(不起作用)
  2. 将 hudson 上的发布目标指定为 -P!attach-source release:prepare release:perform。我认为这会将源插件排除在执行之外。(不工作)。
  3. 尝试将插件阶段指定为超级 pom 中的某个不存在的阶段。(不起作用)
  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

对此的任何帮助将不胜感激。

4

13 回答 13

89

尝试运行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>
于 2012-05-29T07:43:41.330 回答
35

我知道这个问题很老,但今天它是谷歌点击#1,所以我将添加适合最新版本的 maven 3 的答案。

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

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

如果我正确阅读了 Maven 问题跟踪器,那么在撰写本文时,这些错误还没有计划修复(烧毁的 3.4.0 版本可能会影响这些)。

我没有对我的 pom 进行复杂的调整,而是回退到 Maven 版本 3.2.1。

于 2016-06-08T12:16:14.943 回答
11

刚刚遇到同样的问题,我分析了一下。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

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

正如qualidafial在评论中指出的那样,设置performRelease=false改为省略同一文件的两个附件之一。

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

我们可以将此参数作为配置提供给 maven-relase-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 中,看起来现在发布工作没有错误消息。

于 2012-11-07T18:51:33.517 回答
5

我已经为这个问题苦苦挣扎了一段时间,终于能够在我们的基础架构中解决它。这里的答案对我没有帮助,因为我们没有多次执行源插件目标,并且配置对我们来说似乎很好。

我们确实错过了将源插件的执行绑定到一个阶段。扩展 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 目标/附加源执行。通过将我们的执行绑定到某个阶段,我们强制我们的插件只在这个阶段运行。

于 2016-01-22T16:58:33.363 回答
4

跑步时发生在我身上

mvn install deploy

我通过运行避免了这个问题

mvn deploy

(这意味着安装)。在我的情况下,只有一个工件被尝试上传两次,这是一个辅助工件(maven-jar-plugin 被设置为构建一个辅助 jar,除了由 default-jar 执行构建的那个)。

于 2019-08-20T20:55:15.923 回答
1

TL;博士

attach-sources如果您无法修改父 pom,则使用 id 禁用执行可以解决此问题。

--

这个答案是对@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以避免重复绑定的最佳实践。但是如果我不能删除它,因为我不能改变父 pom 怎么办?

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

因此,在 my 下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 中的执行?

于 2020-06-29T05:08:21.763 回答
0

我认为问题不在发布插件中,我认为您已经xxx-sources.jar附上了两次 - 这就是重复上传的原因。没有看到 POM 就很难判断为什么会有重复的附件。尝试运行mvn -X并检查日志以了解谁附加xxx-source.jar了另一个时间。

无论如何,在 Nexus 上一个好的解决方法是拥有一个临时存储库,您可以在其中多次上传版本 - 当一切准备就绪时,您只需关闭/提升临时存储库。查看Sonatype OSS 设置以获取示例。

于 2010-11-23T07:50:34.740 回答
0

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

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

于 2015-11-30T16:08:55.040 回答
0

父和子 pom 中的 Maven 插件不应执行。按照标准约定,在插件管理部分的父 pom 中定义所有具有执行/目标的插件。子 pom 不应重新定义上述细节,而仅提及需要执行的插件(带有 artifactId 和版本)。

我与父 pom 的 maven-assembly-plugin 有类似的问题,如下所示:

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

删除<executions>from child pom 解决了这个问题。有效的 pom 执行了 2 次,导致重复安装到 Nexus 存储库。

于 2016-05-13T20:42:39.530 回答
0

FWIW 这个问题暂时破坏了我们的构建,而答案并非如此。相反,我愚蠢地在 maven-assembly-plugin 中将看似无害的 appendAssemblyId 设置为 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 作为工件的分类器,因此它是 maven 术语中唯一 GAV 坐标的重要部分(实际上它更像 GAVC 坐标 - C 是分类器)。

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

  3. 愚蠢的元素只决定了本地构建工件的名称,而在其余部分中没有任何作用。这是一个完全的红鲱鱼。

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

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

appendAssemblyId

  • 布尔值

  • 设置为 false 以从程序集最终名称中排除程序集 ID,并在没有分类器的情况下创建结果程序集工件。因此,与当前 Maven 项目的打包具有相同格式的组装工件将替换此主项目工件的文件

  • 默认值为:真。
  • 用户属性是:assembly.appendAssemblyId。

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

额外的粗体是我的。文档在这里应该有一个很大的闪烁警告:“将其设置为 false 并放弃所有希望”

我从这个答案中得到了一些关于另一个问题的帮助maven-assembly-plugin: How to use appendAssemblyId tunaki 那里的解释真的很有帮助。

于 2017-08-04T12:20:03.653 回答
0

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

检查并发现问题出在 Jenkins 脚本中。settings.xml 被调用了两次。像:

sh "mvn -s settings.xml clean deploy -s settings.xml deploy -U .....

这导致了这个问题。更新了这一行,它就像一个魅力:

sh "mvn clean deploy -s settings.xml -U .....

于 2020-09-29T13:24:14.733 回答
-1

使用 nexus thix 配置为我工作

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-release-plugin</artifactId>
  <configuration>
    <useReleaseProfile>false</useReleaseProfile>
  </configuration>
</plugin>
于 2021-06-22T09:50:22.423 回答
-2

我使用 releaseProfile=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>
于 2010-11-30T15:57:54.443 回答