120

在 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

并得到错误。任何的想法?

4

16 回答 16

181

我能想到的几件事:

  • 用户凭据错误
  • 服务器的 url 错误
  • 用户无权访问部署存储库
  • 用户无权访问特定的存储库目标
  • 如果它是一个版本(不是 -SNAPSHOT 版本),则工件已经与该版本一起部署
  • 存储库不适合部署相应的工件(例如,快照版本的发布存储库、代理存储库或组而不是托管存储库)

检查这些,如果您仍然遇到问题,请在此处提供更多详细信息。

于 2013-09-09T16:01:37.453 回答
36

只是为了创建一个单独的答案。答案实际上可以在已接受答案的评论中找到。

尝试将工件的版本更改为以-SNAPSHOT.

于 2014-05-05T11:24:33.807 回答
26

如果您尝试执行以下操作,将返回 400 Bad Request:

  1. 将以-SNAPSHOT结尾的快照工件(或版本)部署到发布存储库
  2. 将发布工件(版本-SNAPSHOT结尾)部署到快照存储库
  3. 将同一版本的发布工件多次部署到发布存储库
于 2018-10-15T22:06:38.097 回答
14

对我来说问题的原因是 -source.jars 被上传了两次(使用 maven-source-plugin),正如在接受的答案中提到的原因之一。重定向到我提到的答案: Maven 发布插件失败:源工件被部署两次

于 2016-07-14T13:56:18.157 回答
8

我今天遇到了这个确切的问题,问题是我试图发布的版本:perform 已经在 Nexus 存储库中。

在我的情况下,这可能是由于早期调用 release:perform 期间网络断开所致。尽管我失去了连接,但似乎发布成功了。

于 2014-12-09T16:34:43.723 回答
8

在极少数情况下,您需要将 SAME STABLE 工件重新部署到 Nexus,默认情况下它会失败。如果您随后从 Nexus(通过 Web 界面)删除工件以再次部署它,部署仍然会失败,因为仅删除例如 jar 或 pom 并不会清除目录中仍然存在的其他文件。您需要登录该框并完全删除该目录。

于 2015-10-01T08:06:00.073 回答
4

我今天遇到了同样的问题,添加了“返回代码是:400,ReasonPhrase:错误请求。” 结果是上面的答案中的“工件已经与该版本一起部署,如果它是一个版本”问题在此处输入链接描述

尚未提及的一种解决方案是将 Nexus 配置为允许重新部署到发布存储库中。也许不是最佳实践,因为这是出于某种原因设置的,但您仍然可以转到 Nexus 存储库的“配置”选项卡中的“访问设置”,并将“部署策略”设置为“允许重新部署”。

于 2016-05-03T13:07:31.227 回答
4
  • 在父 pom application==> Version 中放标签如下:xxx-SNAPSHOT

示例:0.0.1-SNAPSHOT

  • “-SNAPSHOT”:非常重要
于 2016-08-10T08:50:13.107 回答
3

确保在 nexus(作为发行版)中不存在(工件和版本)。在这种情况下,返回错误请求。

于 2015-03-25T11:44:36.207 回答
3

对于 400 错误,请检查存储库“部署策略”,通常是“禁用重新部署”。大多数情况下,您的库版本已经存在,这就是为什么您会收到一条消息“Could not PUT put ' https://yoururl/some.jar '。从服务器收到状态代码 400:存储库不允许更新资产:“您的存储库名称"

因此,您有几个选项可以解决此问题。1- 允许重新部署 2- 从您尝试上传的存储库中删除版本 3- 更改版本号

于 2019-05-10T05:16:13.550 回答
2

如果上述任何答案都解决了,您可以直接从(附在下面的 NEXUS 屏幕截图)的管理端创建新工件。

  1. Login to nexusUI http://YOUR_URL:8081/nexus(用户名:admin 默认密码:admin123
  2. Click repositories在左侧然后单击 repo,例如:单击发布。
  3. 选择artifact Upload(最后一个选项卡)。
  4. 选择GAV definitionas GAV Param- 然后输入您的 groupid、artifact id 和 version。
  5. 选择 Jar 文件。
  6. 点击上传工件。就是这样 !

现在您将能够在您的项目中添加相应的内容。(下面的屏幕截图)

在此处输入图像描述

于 2018-02-25T07:26:34.103 回答
2

如果您有围绕版本的命名策略,禁止您尝试部署的版本#,也会发生这种情况。在我的情况下,我试图上传一个版本(以发布 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

于 2019-03-19T21:02:47.173 回答
1

我得到了相同的 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 之前再次运行。

于 2022-01-06T08:04:48.373 回答
0

服务器 id 应与 maven settings.xml 的存储库 id 匹配

于 2020-02-12T20:11:47.177 回答
0

答案为时已晚,但这对我有用: 将“部署策略”更改为“允许重新部署”

于 2021-07-28T17:27:10.400 回答
0
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
于 2021-12-13T02:47:16.047 回答