ChatGPT解决这个技术问题 Extra ChatGPT

在 Nexus 中部署工件时出错

在 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

并得到错误。任何想法?

HTTP 400 表示“错误请求”。我猜其中一个 URL 不正确。
对我来说,问题在于它不是快照版本。

M
Manfred Moser

我能想到的几件事:

用户凭据错误

服务器的 url 错误

用户无权访问部署存储库

用户无权访问特定的存储库目标

如果它是一个版本(不是 -SNAPSHOT 版本),则工件已经与该版本一起部署

存储库不适合部署相应的工件(例如,快照版本的发布存储库、代理存储库或组而不是托管存储库)

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


我将工件的版本更改为 SNAPSHOT,然后部署,一切正常。然后我意识到我正在尝试部署到 Nexus 组(不是 Nexus 存储库),所以我的问题的原因是:'指向我的 Nexus 存储库的 URL 错误'
重要提示:“如果工件是发布版本(不是 -SNAPSHOT 版本),则该版本已经部署了工件”
拯救了我的一天...我从 pom.xml 中的版本中删除了 -SNAPSHOT 字,这就是为什么它无法部署到 nexus...我添加了 SNAPSHOT 字,它起作用了..
根据我的经验,错误的凭据会导致 401,而不是 400。使用“-SNAPSHOT”为版本名称添加后缀为我解决了这个问题。
您可以简单地更改存储库的部署策略以启用重新部署
b
bhagyas

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

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


不,您错过了重点,请仔细阅读评论中提到的“所以我的问题的原因是:'指向我的 nexus 存储库的 URL 错误'”。并了解“返回代码为:400”的含义(在您复制某人的评论作为答案之前)
只是想在这里发表评论,因为我在搜索中点击了这个页面。我遇到了同样的 400 错误,并且 bhagyas 在这里所说的很关键(虽然我当时没有意识到),如果部署到快照存储库,版本必须以 -SNAPSHOT 结尾。我的版本是 1.13.0.SNAPSHOT,我花了一个小时才弄清楚它需要是 1.13.0-SNAPSHOT。
r
roj

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

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


a
ankitkpd

对我来说问题的原因是 -source.jars 被上传了两次(使用 maven-source-plugin),正如在接受的答案中提到的原因之一。重定向到我提到的答案:Maven release plugin fails : source artifacts getting deployed twice


e
eidolon1138

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

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


b
bosvos

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


再补充一点,如果您没有对服务器的交互式访问权限(我没有 - 它是一个托管框),您可以使用 HTTP DELETE 删除有问题的工件。我为此目的使用 PostMan
我不确定是不是因为我使用的是 S3 blobstore 插件,但我没有看到与 repo 结构匹配的目录结构。确定要删除哪些目录有什么技巧吗?我所有的文件都用哈希命名。目录格式为 content/vol-{01-43}/chap-{01-47}
您还可以通过从存储库导航到发布目录来删除发布的所有文件,而不是从 GAV 类型搜索中查找工件。在存储库视图中,您可以右键单击目录以获取对该 GAV 中所有文件的删除操作。
C
Community

我今天遇到了同样的问题,添加了“返回代码是:400,ReasonPhrase:错误请求。”原来是enter link description here上面的答案中的“如果它是一个版本,则工件已经与该版本一起部署”问题

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


F
Fadid

在父 pom application==> Version 中放标签如下:xxx-SNAPSHOT

示例:0.0.1-SNAPSHOT

“-SNAPSHOT”:非常重要


d
danipenaperez

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


F
Furqan

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

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


允许重新部署发布存储库通常不被认为是一种好的做法。不要不加考虑地这样做。
@Itaypk 你是对的,这就是我提出其他一些建议的原因。在我看来,更改版本更好。
v
vipin cp

如果上述任何答案都解决了,您可以直接从(附在下面的 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


o
old-monk

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


h
helmy

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


R
Ravi Petchimuthu

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


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

B
Brad M

在您的 release:prepare 步骤之后,观看我们的 CI 进行部署。对我们来说,最近在 Jenkins 中引入的官方 Bitbucket Server Integration plugin 立即在 release:prepare 的推动下火了起来。

修复方法是在插件中添加一个“轮询忽略带有某些消息的提交”的步骤:^(?s)\[maven-release-plugin\].*(来自 https://stackoverflow.com/a/32371336/1399659


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅