【问题标题】:Error when deploying an artifact in Nexus在 Nexus 中部署工件时出错
【发布时间】:2013-09-10 01:33:06
【问题描述】:

在 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

并得到错误。有什么想法吗?

【问题讨论】:

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

标签: maven deployment pom.xml nexus


【解决方案1】:

我能想到的几件事:

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

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

【讨论】:

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

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

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

【讨论】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

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

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

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

        【讨论】:

          【解决方案8】:
          • 在父pom应用程序==>版本中放标签如下:x.x.x-SNAPSHOT

          示例:0.0.1-SNAPSHOT

          • “-SNAPSHOT”:非常重要

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

              • 允许重新部署发布存储库通常不是一个好的做法。不要不加考虑地这样做。
              • @Itaypk 你是对的,这就是我提出其他一些建议的原因。在我看来,更改版本更好。
              【解决方案11】:

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

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

              现在您可以在项目中添加相应的内容了。(下面的屏幕截图)

              【讨论】:

                【解决方案12】:

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

                【讨论】:

                  【解决方案13】:

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

                  【讨论】:

                    【解决方案14】:

                    答案为时已晚,但这对我有用: Changing "Deployment Policy" to "Allow redeploy"

                    【讨论】:

                      【解决方案15】:
                      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
                      

                      【讨论】:

                        【解决方案16】:

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

                        【讨论】:

                          猜你喜欢
                          • 2013-03-07
                          • 2016-01-29
                          • 1970-01-01
                          • 2019-05-11
                          • 1970-01-01
                          • 2014-01-01
                          • 2013-01-12
                          • 2012-08-04
                          相关资源
                          最近更新 更多