在Nexus部署构件时出现错误

129

在Nexus服务器中部署artifact时遇到错误:“无法传送artifact”“无法传输文件http:///my_artifact。返回代码为:400”

我正在运行Nexus,并使用以下maven本地配置运行一个自定义存储库my_repo:

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

并且收到了错误。有任何想法吗?


3
HTTP 400 表示“错误请求”。我猜测其中一个 URL 不正确。 - Mark O'Connor
4
对我来说问题在于它不是快照版本。 - maveroid
16个回答

203

以下是我能想到的一些问题:

  • 用户凭证错误
  • 服务器URL错误
  • 用户没有访问部署仓库的权限
  • 用户没有访问特定仓库目标的权限
  • 如果是发布版本(而不是-SNAPSHOT版本),则该版本的构件已经被部署
  • 该仓库不适合于部署相应的构件(例如,快照版本的发布仓库,代理仓库或组代替托管仓库)

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


51
我将我的构件版本更改为 SNAPSHOT 并部署,一切都正常。然后我意识到我尝试部署到 Nexus 组(而不是 Nexus 存储库),所以我的问题原因是:“我的 Nexus 存储库 URL 是错误的”。 - acimutal
11
重要提示:如果该版本是一个发布版本(不是-SNAPSHOT版本),则该工件已经使用该版本部署。 - Bhushan
4
拯救了我的一天... 我从pom.xml文件中的版本中删除了“-SNAPSHOT”单词,因此无法部署到Nexus上... 我将“SNAPSHOT”单词重新添加回去,然后它就可以工作了... - venugopal
4
根据我的经验,错误的凭证会导致状态码为401而不是400。在版本名称后面加上“-SNAPSHOT”解决了我的问题。 - Marcus Junius Brutus
3
您可以简单地更改代码库的部署策略以启用重新部署。 - Furqan
显示剩余14条评论

38

为了单独创建答案,实际上在被接受的答案评论中找到了答案。

尝试将您的构件版本更改为以-SNAPSHOT结尾。


3
不,你错过了整个重点,请仔细阅读评论,它提到:“所以我的问题原因是:'我的Nexus存储库的URL不正确'”。并了解一下“返回代码为400”的含义(在你把别人的评论复制作为答案之前)。 - kuhajeyan
15
因为我在搜索时也遇到了同样的400错误,所以我想在这里评论一下。Bhagyas在这里提到的是关键(尽管当时我没有意识到),如果部署到快照存储库,则版本号必须以“-SNAPSHOT”结尾。我的版本号是1.13.0.SNAPSHOT,花了我一个小时才发现它应该是1.13.0-SNAPSHOT。 - Craig

37

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

  1. 将以-SNAPSHOT结尾的快照构件(或版本)部署到发布存储库
  2. 将不以-SNAPSHOT结尾的发布构件(版本)部署到快照存储库
  3. 发布存储库中多次部署同一版本的发布构件

我的错误在第三种情况下:我必须在Nexus中启用部署策略:allow-redeploy,以确保它成功。 - undefined

17

10

如果你需要重新部署相同的稳定构件到Nexus,这种情况很少见,但默认情况下会失败。如果你通过web界面从Nexus中删除该构件(为了再次部署它),部署仍将失败,因为仅仅删除例如jar或pom并不能清除目录中仍然存在的其他文件。你需要登录到服务器并完全删除该目录。


3
补充一下,如果您无法交互式访问服务器(我不能-它是一个托管的盒子),您可以使用HTTP DELETE删除有问题的工件。我使用PostMan来实现这个目的。 - Nathan Russell
我不确定是否因为我使用了S3 blobstore插件,但是我没有看到与repo结构相匹配的目录结构。有什么技巧可以识别要删除的目录吗?所有我的文件都以哈希值命名。目录格式为content/vol-{01-43}/chap-{01-47} - chizou
您也可以通过从存储库中的发布目录导航而不是从GAV类型搜索中查找构件来删除所有发布的文件。在存储库视图中,您可以右键单击目录以获取该GAV下所有文件的删除操作。 - Christian Trimble

9
今天我遇到了完全相同的问题,问题是我尝试发布的版本已经在Nexus仓库中了。
在我的情况下,这可能是由于早期调用release:perform时出现了网络断开连接造成的。即使我失去了连接,似乎发布仍然成功了。

4
  • 在父POM应用程序中==>版本中,将标签放置如下:x.x.x-SNAPSHOT

例如:0.0.1-SNAPSHOT

  • "-SNAPSHOT":非常重要

4
今天我遇到了同样的问题,添加了“返回代码为:400,原因短语为:Bad Request”的内容,结果是来自上面答案的“如果是发布版,则已经部署了该版本的工件”问题。enter link description here 还有一个未提及的解决方案是配置Nexus允许重新部署到发布库。也许这不是最佳实践,因为这是出于某种原因设置的,但您仍然可以进入Nexus存储库的“配置”选项卡中的“访问设置”,并将“部署策略”设置为“允许重新部署”。

3

确保nexus中不存在该版本(artifact和version),如果存在该版本(作为发布版本),则返回错误请求。


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

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

允许重新部署发布存储库通常不被视为良好的做法。请谨慎考虑后再进行操作。 - Itaypk
1
@Itaypk,你是对的,这就是为什么我建议了一些其他的建议。在我看来,更改版本是更好的选择。 - Furqan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接