Maven发布插件失败:源文件被部署两次

我们正在使用哈德森的maven发布插件,并试图自动发布过程。 发布:准备工作正常。 当我们尝试执行发行版时:执行,因为它试图将源工件两次上传到存储库,所以失败。

我试过的东西,

  1. 删除包含maven源插件的configuration文件,从超级pom(没有工作)
  2. 指定哈德森发布的目标为-P!附加源版本:准备发布:执行。 我认为这将排除源插件执行。 (不工作)。
  3. 尝试指定插件阶段到一些不存在的阶段在超级POM(没有工作)
  4. 尝试指定插件configuration,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 

任何有关这个帮助将非常感激。

尝试运行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> 

为了解决这个问题,find你使用maven-source-plugin ,并确保你使用了“id”attach-sources,这样就和发布configuration文件一样。 然后这些部分将被合并。

最佳实践说,为了获得一致性,您需要在build> pluginManagement的项目的根POM中进行configuration,而不是在您的子项目中进行configuration。 在子pom中,您只需在构build>插件中指定要使用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> 

我知道这个问题是旧的,但它是今天谷歌命中#1,所以我会添加我的答案适合最新版本的maven 3。

问题是源代码和javadoc jar在使用maven 3的版本进行发布版本时部署了两次。如果您使用maven将工件部署到Sonatype Nexus存储库,只允许发布一次发布工件,是完全合理的行为),当第二次上传尝试被拒绝时,构build失败。 哎呀!

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

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

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

只是遇到了同样的问题,我分析了一下。 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产生的标签release:prepare和调用这个:

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

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

正如评论中的qualidafial所指出的那样 ,设置performRelease=false而不是省略同一个文件的两个附件中的一个。

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

我们可以把这个参数作为configuration提供给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中,现在看起来像<useReleaseProfile>false</useReleaseProfile>一样没有错误消息。

我不认为probem是在发布插件,我认为你有两个xxx-sources.jar附加 – 这就是为什么重复上传。 为什么有一个重复的附件很难说没有看到聚甲醛。 尝试运行mvn -X并检查另一次是否附加xxx-source.jar的日志。

无论如何,在Nexus上的一个很好的解决方法是有一个临时存储库,您可以在其中多次上传发行版 – 当一切准备就绪时,您只需closures/提升临时存储库。 检查Sonatype OSS设置的例子。

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

但是,这种错误configuration的原因可能会有所不同。 在我的情况下,在Jenkins的mvn clean deploy构build步骤中,工件被正确上传,但是当第二次部署被尝试时失败了。 第二个部署已经在Jenkins的构build步骤“在Maven仓库中发布工件”中进行了configuration。

我一直在这个问题上苦苦挣扎,终于能够在我们的基础设施中解决这个问题。 这里的答案并没有帮助我,因为我们没有多次执行源插件的目标,configuration对我们来说似乎很好。

我们错过的是将源插件的执行绑定到一个阶段。 由Bae扩展的例子,包括行<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目标/ attach-sources执行。 通过将我们的执行绑定到某个阶段,我们强制我们的插件只能在这个阶段运行。

父母和孩子的妈妈插件不应该有执行。 根据标准惯例,在插件pipe理部分中定义所有带有执行/目标的插件。 子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> 

而孩子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回购。

FWIW这个问题正在打破我们的构build一段时间,答案是没有上述。 相反,我愚蠢地把看似无害的appendAssemblyId设置为一个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作为工件的分类器 ,因此它是Maven中唯一的GAV坐标的基本部分(实际上它更像是GAVC坐标 – C是分类器)。

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

  3. 愚蠢的元素只确定本地构build工件名称,并在其余部分中不起作用。 这是一个完整的红鲱鱼。

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

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

appendAssemblyId

  • 布尔

  • 设置为false以从程序集最终名称中排除程序集标识,并创build没有分类程序的结果程序集工件。 因此,具有与当前Maven项目打包相同格式的程序集工件将replace此主项目工件的文件

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

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

额外的大胆是我的。 文档应该在这里有一个大闪烁的警告:“设置这个假,放弃所有的希望”

我从这个答案得到了一些关于不同的问题的帮助maven-assembly-plugin:如何使用appendAssemblyId从tunaki那里的解释真的帮助。

我用releaseProfile = falseconfiguration了maven发行版插件,并且不执行源工件configuration文件。 这是什么窍门。

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