在 Nexus 服务器中我自己的存储库中部署工件时出现错误:“无法部署工件:无法传输工件”“无法传输文件 http:///my_artifact。返回代码为:400”
我让 Nexus 运行一个自定义存储库 my_repo 和下一个 Maven 本地配置:
设置.xml
<server>
<id>my_repo</id>
<username>user</username>
<password>pass</password>
</server>
...
<mirror>
<id>my_repo</id>
<name>Repo Mirror</name>
<url><my_url_to_my_repo></url>
<mirrorOf>*</mirrorOf>
</mirror>
用户有权创建/读取/写入 my_repo -
pom.xml
<distributionManagement>
<repository>
<id>my_repo</id>
<name>my_repo</name>
<url><my_url_to_my_repo></url>
<layout>default</layout>
</repository>
<snapshotRepository>
<id>snapshots</id>
<name>Snapshots</name>
<url><my_url_to_my_snapshot_repo></url>
</snapshotRepository>
</distributionManagement>
然后我执行
mvn deploy
并得到错误。任何想法?
我能想到的几件事:
用户凭据错误
服务器的 url 错误
用户无权访问部署存储库
用户无权访问特定的存储库目标
如果它是一个版本(不是 -SNAPSHOT 版本),则工件已经与该版本一起部署
存储库不适合部署相应的工件(例如,快照版本的发布存储库、代理存储库或组而不是托管存储库)
检查这些,如果您仍然遇到问题,请在此处提供更多详细信息。
只是为了创建一个单独的答案。答案实际上可以在已接受答案的评论中找到。
尝试将工件的版本更改为以 -SNAPSHOT
结尾。
如果您尝试执行以下操作,将返回 400 Bad Request:
将以 -SNAPSHOT 结尾的快照工件(或版本)部署到发布存储库 将发布工件(不以 -SNAPSHOT 结尾的版本)部署到快照存储库 将发布工件的同一版本多次部署到发布存储库
对我来说问题的原因是 -source.jars 被上传了两次(使用 maven-source-plugin),正如在接受的答案中提到的原因之一。重定向到我提到的答案:Maven release plugin fails : source artifacts getting deployed twice
我今天遇到了这个确切的问题,问题是我试图发布的版本:perform 已经在 Nexus 存储库中。
在我的情况下,这可能是由于早期调用 release:perform 期间网络断开所致。尽管我失去了连接,但似乎发布成功了。
在极少数情况下,您需要将 SAME STABLE 工件重新部署到 Nexus,默认情况下它会失败。如果您随后从 Nexus(通过 Web 界面)删除工件以再次部署它,部署仍然会失败,因为仅删除例如 jar 或 pom 并不会清除目录中仍然存在的其他文件。您需要登录该框并完全删除该目录。
content/vol-{01-43}/chap-{01-47}
我今天遇到了同样的问题,添加了“返回代码是:400,ReasonPhrase:错误请求。”原来是enter link description here上面的答案中的“如果它是一个版本,则工件已经与该版本一起部署”问题
尚未提及的一种解决方案是将 Nexus 配置为允许重新部署到发布存储库中。也许不是最佳实践,因为这是出于某种原因设置的,但您仍然可以转到 Nexus 存储库的“配置”选项卡中的“访问设置”,并将“部署策略”设置为“允许重新部署”。
在父 pom application==> Version 中放标签如下:xxx-SNAPSHOT
示例:0.0.1-SNAPSHOT
“-SNAPSHOT”:非常重要
确保在 nexus(作为发行版)中不存在(工件和版本)。在这种情况下,返回错误请求。
对于 400 错误,请检查存储库“部署策略”,通常是“禁用重新部署”。大多数情况下,您的库版本已经存在,这就是为什么您会收到一条消息“无法 PUT put 'https://yoururl/some.jar'。从服务器收到状态代码 400:存储库不允许更新资产:“您的存储库名称”
因此,您有几个选项可以解决此问题。 1- 允许重新部署 2- 从您尝试上传的存储库中删除版本 3- 更改版本号
如果上述任何答案都解决了,您可以直接从(附在下面的 NEXUS 屏幕截图)的管理端创建新工件。
登录nexus UI http://YOUR_URL:8081/nexus(用户名:admin 默认密码:admin123 )点击左侧的repositories 然后点击repo,例如:点击release。选择工件上传(最后一个选项卡)。选择 GAV 定义作为 GAV 参数 - 然后输入您的 groupid 、 artifact id 和 version 。选择 Jar 文件。点击上传工件。而已 !
现在您将能够在您的项目中添加相应的内容。(下面的屏幕截图)
https://i.stack.imgur.com/acfJw.png
如果您有围绕版本的命名策略,禁止您尝试部署的版本#,也会发生这种情况。在我的情况下,我试图上传一个版本(以发布 repo)2.0.1
,但后来发现我们的 nexus 配置不允许发布整数以外的任何内容。
我稍后尝试使用版本 2
并成功部署它。
错误消息绝对没有帮助:
Return code is: 400, ReasonPhrase: Repository does not allow updating assets: maven-releases-xxx. -> [Help 1]
更好的消息可能是version 2.0.1 violates naming policy
我得到了相同的 400 响应状态,并且通过添加 -Dresume=false
解决了该问题。
mvn -B release:prepare release:perform -Dresume=false
在我的情况下,release:prepare 目标被跳过,并且在输出中记录了以下消息。
[INFO] Release preparation already completed. You can now continue with release:perform, or start again using the -Dresume=false flag
我怀疑我可能在 pom.xml 中进行了更改,需要强制 release:prepare 在运行 release:perform 之前再次运行。
服务器 id 应与 maven settings.xml 的存储库 id 匹配
What worked for me was disabling the ReleaseProfile that comes with the release plugin and skipping the deployment in the deploy plugin
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<tagNameFormat>v@{project.version}</tagNameFormat
<autoVersionSubmodules>true</autoVersionSubmodules>
<releaseProfiles>releases</releaseProfiles>
<useReleaseProfile>false</useReleaseProfile>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
Use mvn help:effective-pom
在您的 release:prepare
步骤之后,观看我们的 CI 进行部署。对我们来说,最近在 Jenkins 中引入的官方 Bitbucket Server Integration plugin 立即在 release:prepare
的推动下火了起来。
修复方法是在插件中添加一个“轮询忽略带有某些消息的提交”的步骤:^(?s)\[maven-release-plugin\].*
(来自 https://stackoverflow.com/a/32371336/1399659)