在Nexus中部署工件时出错


102

在Nexus服务器的我自己的存储库中部署工件时,出现错误消息:“无法部署工件:无法传输工件”“无法传输文件http:/// my_artifact。返回码是:400”

我的Nexus运行有一个自定义存储库my_repo,并具有下一个maven本地配置:

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

并得到错误。任何想法?


2
HTTP 400表示“错误请求”。我猜测其中一个网址不正确。
Mark O'Connor

对我来说,问题是它不是快照版本。
maveroid '19

Answers:


156

我能想到的几件事:

  • 用户凭证错误
  • 伺服器网址错误
  • 用户无权访问部署存储库
  • 用户无权访问特定的存储库目标
  • 如果该工件是发行版(不是-SNAPSHOT版本),则已经与该版本一起部署。
  • 该存储库不适合部署各自的工件(例如,快照版本,代理存储库或组的发布存储库,而不是托管存储库)

检查那些,如果仍然遇到麻烦,请在此处提供更多详细信息。


44
我将工件的版本更改为SNAPSHOT,然后进行部署,一切正常。然后我意识到我正在尝试部署到Nexus组(而不是Nexus存储库),所以导致我出现问题的原因是:“我的
连结

5
重要说明:“如果该版本是发行版,则该版本已经部署了工件(不是-SNAPSHOT版本)”
布山,

1
保存了我的一天...我从pom.xml的版本中删除了-SNAPSHOT单词,这就是为什么它无法部署到nexus上的原因...我又添加了SNAPSHOT单词,并且可以正常工作..
venugopal

3
以我的经验,错误的凭证会导致401,而不是400。为版本名加上“ -SNAPSHOT”后缀会为我解决此问题。
Marcus Junius Brutus

1
您只需更改存储库的部署策略即可启用重新部署
Furqan

35

只是创建一个单独的答案。答案实际上是在已接受答案的注释中找到的。

尝试更改商品的版本以结尾-SNAPSHOT


2
不,您没有完整点,请仔细阅读评论,其中提到“因此,我的问题原因是:“指向我的连结存储库的网址错误”。并了解“返回码是:400”的含义(在您复制某人的注释作为答案之前)
kuhajeyan 2015年

13
自从我在搜索中点击此页面以来,只想在这里发表评论。我遇到了同样的400错误,bhagyas在这里所说的是关键(尽管当时我还没有意识到),如果将版本部署到快照存储库中,则必须以-SNAPSHOT结尾。我的版本是1.13.0.SNAPSHOT,我花了一个小时才弄清楚它需要是1.13.0-SNAPSHOT。
Craig

16

如果您尝试执行以下操作,则会返回400错误请求:

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


7

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

就我而言,这可能是由于在早期调用release:perform期间网络断开。即使我断开了连接,发布似乎仍然成功。


7

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


2
只是要添加此内容,如果您没有对服务器的交互式访问(我没有-它是一个受管盒),则可以使用HTTP DELETE删除有问题的工件。我出于这个目的使用PostMan
Nathan Russell

我不确定是否是因为我使用的是S3 blobstore插件,但没有看到与回购结构匹配的目录结构。是否有一些技巧可以识别要删除的目录?我所有的文件都用哈希命名。目录的格式为content/vol-{01-43}/chap-{01-47}
majikman

您也可以通过从存储库导航到发布目录来删除发布的所有文件,而不用从GAV类型搜索中查找工件。在存储库视图中,您可以右键单击目录以对该GAV上的所有文件执行删除操作。
Christian Trimble

3

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

尚未提及的一种解决方案是将Nexus配置为允许重新部署到发布存储库中。也许不是最佳做法,因为这是有原因设置的,但是您仍然可以转到Nexus存储库“配置”-标签中的“访问设置”,然后将“部署策略”设置为“允许重新部署”。


3
  • 在父pom应用程序中==>版本将标签如下:xxx-SNAPSHOT

例如:0.0.1-SNAPSHOT

  • “ -SNAPSHOT”:非常重要

2

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


2

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

因此,您有一些选择可以解决此问题。1-允许重新部署2-从您要上载的存储库中删除版本3-更改版本号


通常不认为允许重新发布版本存储库是一个好习惯。不要不加考虑就这样做。
Itaypk

1
@Itaypk你是对的,这就是为什么我提出了其他一些建议的原因。我认为更改版本会更好。
Furqan

1

如果以上任何一个答案都能解决,您可以直接从admin的管理员端创建新的工件(下面是NEXUS屏幕截图)。

  1. Login to nexus用户界面http:// YOUR_URL:8081 / nexus(用户名:admin 默认密码:admin123
  2. Click repositories 在左侧,然后单击仓库,例如:单击发布。
  3. 选择 artifact Upload(最后一个标签)。
  4. 选择GAV definitionGAV Param -然后输入您的组ID,工件ID和版本。
  5. 选择Jar文件。
  6. 单击上传工件。而已 !

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

在此处输入图片说明


1

如果您有关于版本的命名策略,并且禁止尝试部署的版本号,则也会发生这种情况。就我而言,我试图上传一个版本(以发布仓库)2.0.1但后来发现我们的关系配置不允许发布除整数以外的任何内容。

我后来尝试使用版本 2并成功部署了它。

该错误消息绝对无济于事:

Return code is: 400, ReasonPhrase: Repository does not allow updating assets: maven-releases-xxx. -> [Help 1]

一个更好的信息本来是 version 2.0.1 violates naming policy


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.