Maven 依赖项失败并出现 501 错误

Maven dependencies are failing with a 501 error

最近 MavenJenkins 中构建作业 运行 失败,并出现以下异常,表示他们无法拉取依赖项来自 Maven Central,应该使用 HTTPS。我不确定如何将请求从 HTTP 更改为 HTTPS。有人可以指导我解决这个问题吗?

[ERROR] Unresolveable build extension:
Plugin org.apache.maven.wagon:wagon-ssh:2.1 or one of its dependencies could not be resolved:
Failed to collect dependencies for org.apache.maven.wagon:wagon-ssh:jar:2.1 ():
Failed to read artifact descriptor for org.apache.maven.wagon:wagon-ssh:jar:2.1:
Could not transfer artifact org.apache.maven.wagon:wagon-ssh:pom:2.1 from/to central (http://repo.maven.apache.org/maven2):
Failed to transfer file: http://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-ssh/2.1/wagon-ssh-2.1.pom.
Return code is: 501, ReasonPhrase:HTTPS Required. -> [Help 2]

Waiting for Jenkins to finish collecting data[ERROR]
Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be resolved:
Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1:
Could not transfer artifact org.apache.maven.plugins:maven-clean-plugin:pom:2.4.1 from/to central (http://repo.maven.apache.org/maven2):
Failed to transfer file: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom.
Return code is: 501 , ReasonPhrase:HTTPS Required. -> [Help 1]

尝试在任何浏览器中点击下面的URL。它将 return 501

http://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-ssh/2.1/wagon-ssh-2.1.pom

请尝试使用 https。它将下载一个 pom.xml 文件:

https://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-ssh/2.1/wagon-ssh-2.1.pom

请在setting.xml文件中添加(https://repo.maven.apache.org/maven2):

<repositories>
   <repository>
      <id>Central Maven repository</id>
      <name>Central Maven repository https</name>
      <url>https://repo.maven.apache.org/maven2</url>
   </repository>
</repositories>

Effective January 15, 2020, The Central Repository no longer supports insecure communication over plain HTTP and requires that all requests to the repository are encrypted over HTTPS.

If you're receiving this error, then you need to replace all URL references to Maven Central with their canonical HTTPS counterparts.

(source)

我们在我的项目 build.gradle 中进行了以下更改:

旧:

repositories {
   maven { url "http://repo.maven.apache.org/maven2" }
}

新:

repositories {
   maven { url "https://repo.maven.apache.org/maven2" }
}

Central 501 HTTPS Required

中解释了观察到的错误的原因

Effective January 15, 2020, The Central Repository no longer supports insecure communication over plain HTTP and requires that all requests to the repository are encrypted over HTTPS.

看起来最新版本的 Maven(试用 3.6.0、3.6.1)已经默认使用 HTTPS URL。

以下是主要存储库切换的日期:

Your Java builds might break starting January 13th (if you haven't yet switched repo access to HTTPS)

更新:似乎从 maven 3.2.3 开始,maven central 是通过 HTTPS 访问的 参见

Maven 变更日志 (http://maven.apache.org/docs/3.2.3/release-notes.html)

理想情况下,对于所有公司编码人员, 如果你得到这个错误,这意味着你的代码库仍然是从开源社区构建的。您需要使用内部公司 Maven 存储库管理器来覆盖 "central" 存储库。

您可以转到 settings.xml 并将您的中央存储库 URL 从 http:// 改写为 https://

<M2_HOME>/conf/settings.xml

找到 mirrors 部分并添加以下条目:

    <mirror>
     <id>other-mirror</id>
     <name>Other Mirror Repository</name>
     <url>https://other-mirror.repo.other-company.com/maven2</url>
     <mirrorOf>central</mirrorOf>
    </mirror>

在 URL 部分,如果您使用 http://repo1.maven.org/maven2/ or http://repo.maven.apache.org/maven2/

替换http://repo1.maven.org/maven2/ with https://repo1.maven.org/maven2/

替换http://repo.maven.apache.org/maven2/ with https://repo.maven.apache.org/maven2/

您需要在此处理想地使用您公司的源代码管理 management/repository URL。因为这将阻止与开源 Maven 存储库社区的任何联系。

如其他答案中所述,自 2020 年 1 月 15 日起,中央 Maven 存储库不支持通过纯 HTTP 进行的不安全通信。

更新 Maven 的中央存储库并使用 https 代替 http

<repositories>
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

我使用的是过时版本的 Maven(3.0.3 和 3.1)。这些旧版本不再支持 http 存储库(如上所述)。升级到 Maven 3.6 是我的解决方法。

pom.xml中添加以下存储库。

<project>
...
    <repositories>
        <repository>
            <id>central</id>
            <name>Maven Plugin Repository</name>
            <url>https://repo1.maven.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
...
</project>

我在 Docker 容器上使用全新安装的 Maven/Java。

对我来说,我必须 cd $M2_HOME/conf 并在那里编辑 settings.xml 文件。在 <mirrors>...</mirrors>

中添加以下块
<mirror>
  <id>central-secure</id>
  <url>https://repo.maven.apache.org/maven2</url>
  <mirrorOf>central</mirrorOf>
</mirror>

我有同样的问题,但我使用 GitLab 而不是 Jenkins。我必须采取的步骤来解决这个问题:

  1. 我的项目在 GitLab 中,所以它使用指向 Docker 图像的 .yml 文件我必须进行持续集成,它使用的图像具有 http://maven URLs. So I changed that to https://maven.
  2. 同一个 Docker 文件图像有一个旧版本的 Maven 3.0.1,它在一夜之间给我带来了问题。我更新了 Docker 文件以获取最新版本 3.6.3
  3. 然后我将该图像部署到我的在线存储库,并更新了我的 Maven 项目 ymlfile 以使用该新图像。
  4. 最后,我更新了我的主要项目 POM 文件以引用 https://maven... instead of http://maven

我意识到这更适合我的设置。但是如果不执行上述所有步骤,我仍然会继续收到此错误消息 Return code is: 501 , ReasonPhrase:HTTPS Required

Maven is moving to HTTPS and disabling HTTP access

简而言之,从 2020 年 1 月 15 日起,Maven 中央存储库不再支持 HTTP 连接(其他存储库也在做同样的事情)。因此,您将指示您的 Maven/Gradle 设置使用 HTTPS URL.

解法:

您可以选择以下三种方法之一。

  1. 在项目的 pom.xml 文件中添加存储库

    <project>
    ...
      <repositories>
        <repository>
          <id>central maven repo</id>
          <name>central maven repo https</name>
          <url>https://repo.maven.apache.org/maven2</url>
        </repository>
      </repositories>
    </project>
    
  2. 将存储库添加到 settings.xml 文件的配置文件中。

    <profile>
      <id>my profile</id>
      <repositories>
        <repository>
          <id>central maven repo</id>
          <name>central maven repo https</name>
          <url>https://repo.maven.apache.org/maven2</url>
          </repository>
      </repositories>
    </profile>
    
  3. 将您的 Maven 版本更新为默认使用 https 值的新版本。此时此刻最新一期3.6.3Download here

对于Gradle:

仅替换 HTTPS 版本的 URL。

repositories {
   maven { url "https://repo.maven.apache.org/maven2" }
}

我遇到了同样的问题。我尝试了两种解决方案,都适合我。

  • 更新Maven版本库(Maven版本>=3.2.3)
  • 限制当前 Maven 版本使用 HTTPS 链接。

更新Maven版本库:

下载包含默认 https 地址 (Apache Maven 3.6.3 binary). And open the Options dialog window in tools of NetBeans menu bar (Java Maven Dialog View). And select browse option in Maven Home List Box (Maven Home List Box View). After adding the Apache Maven newly downloaded version (Updated Maven Home List Box View) 的 Apache Maven 二进制文件,项目成功构建并运行。

限制当前 Maven 版本使用 HTTPS 链接:

在您的项目的 pom.xml 中包含以下代码。

<project>
      ...
    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <name>Central Repository</name>
            <url>https://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <updatePolicy>never</updatePolicy>
            </releases>
        </pluginRepository>
    </pluginRepositories>
    <repositories>
        <repository>
            <id>central</id>
            <name>Central Repository</name>
            <url>https://repo.maven.apache.org/maven2</url>
            <layout>default</layout>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</project>

如其他答案所述,现在需要 https 才能向 Maven Central 发出请求,而旧版本的 Maven 使用 http

如果您不想 to/cannot 升级到 Maven 3.2.3+,您可以通过将以下代码添加到您的 MAVEN_HOME\conf\settings.[=27 来解决这个问题=] 进入 <profiles> 部分:

<profile>
    <id>maven-https</id>
    <activation>
        <activeByDefault>true</activeByDefault>
    </activation>
    <repositories>
        <repository>
            <id>central</id>
            <url>https://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>central</id>
            <url>https://repo1.maven.org/maven2</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories> 
</profile>

除非您在需要时在 POM 中disable/override它,否则这将始终是一个活动设置。

对我(公司编码员)来说,还在 settings.xml 中添加镜像存储库解决了这个问题。我还在 docker 容器中使用 Maven。

<mirrors>
    <mirror>
        <id>https-mirror</id>
        <name>Https Mirror Repository</name>
        <url>https://repo1.maven.org/maven2</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

使用 Ubuntu 16.04,java 1.8.0_201。

我卸载了旧的maven并安装了Maven 3.6.3, 仍然收到此错误,即 Maven 依赖项因 501 错误而失败。

意识到这可能是一个与需要 https 相关的 truststore/keystore 问题。 发现您现在可以使用 jvm.config 文件配置 -Djavax 选项,请参阅:https://maven.apache.org/configure.html.

因为我也在使用 Tomcat,所以我将密钥库和信任库配置从 Tomcat (setenv.sh) 复制到我的 jvm.config,然后就可以了!

还有一个选项可以在 'export MAVEN_OPTS' 中传递此配置(当使用 mvn generate 时)但是虽然这阻止了 501 错误,但它创建了另一个错误:它需要一个 pom 文件。

创建一个单独的 jvm.config 文件效果很好,只需将其放在项目的根目录中即可。

希望这对某人有帮助,我花了一整天才弄明白!

jcenter 也出现同样的问题。

From 13 Jan 2020 onwards, Jcenter is only available at HTTPS.

使用相同的方式获取依赖项的项目将开始面临问题。要快速修复,请在 build.gradle

中执行以下操作

而不是

repositories {
jcenter ()
//others
}

使用这个:

repositories {
jcenter { url "http://jcenter.bintray.com/"}
//others
}

我将以下代码段添加到 setting.xml 并解决了问题,

<mirrors>
    <mirror>
        <id>maven-mirror</id>
        <name>Maven Mirror</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <mirrorOf>central</mirrorOf>
    </mirror>
</mirrors>

分享这个以备不时之需:

旧 Gradle 配置(没有 Gitlab,Docker 部署,用于简单项目)

repositories {
google()
jcenter()

maven { url "http://dl.bintray.com/davideas/maven" }
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'http://repo1.maven.org/maven2' }
maven { url 'http://jcenter.bintray.com' }
}

新配置:

repositories {
google()
jcenter()

maven { url "https://dl.bintray.com/davideas/maven" }
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'https://repo1.maven.org/maven2' }
maven { url 'https://jcenter.bintray.com' }
}

注意 https。编码愉快:)

错误:

传输文件失败:http://repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-ssh/2.1/wagon-ssh-2.1.pom

Return 代码为:501,ReasonPhrase:HTTPS 必填。

根本原因分析:

Maven Central 期望客户端使用 https,但客户端仅发出纯 HTTP 请求。

因此,下载名为 'wagon-ssh-2.1.pom' 的包的请求失败。

如何解决这个问题?

替换URL“http://repo.maven.apache.org/maven2

与“https://repo.maven.apache.org/maven2

在项目的pom.xml文件或build.gradle文件中。

我目前的环境不支持HTTPS,所以添加不安全版本的repo解决了我的问题:http://insecure.repo1.maven.org as per Sonatype

    <repositories>
       <repository>
          <id>Central Maven repository</id>
          <name>Central Maven repository insecure</name>
          <url>http://insecure.repo1.maven.org</url>
       </repository>
    </repositories>

最初来自 虽然这可能有用:

请注意,您的父 pom 也可以(重新)定义存储库,并且如果它出于某种原因覆盖了中心并指定了 http,则您需要修复它(因此需要修复的地方:~/.m2/settings.xml 以及父 poms)。

如果你不能在父 pom 中修复它,你可以在你的子 pom 中覆盖父 pom 的 repo,就像这样(从 3.6.3 默认值中提取 super pom,他们似乎改变了名称从还有 repo1):

  <repositories>
    <repository>
      <id>central</id>
      <name>Central Repository</name>
      <url>https://repo.maven.apache.org/maven2</url> <!-- the https you've been looking for -->
      <layout>default</layout>
      <snapshots>
        <enabled>false</enabled> <!-- or set to true if desired, default is false -->
      </snapshots>
    </repository>
  </repositories>

我下载了最新的 eclipse 并从这里开始使用 https://www.eclipse.org/downloads/packages/release/ 这解决了我的问题。

如果您使用的是旧版本的 Netbeans,则必须在 Maven 中进行更改才能使用 https 而不是 http

打开 C:\Program Files\NetBeans8.0.2\java\maven\conf\settings.xml 并在 mirrors 标签

之间粘贴以下代码
<mirror>
<id>maven-mirror</id>
<name>Maven Mirror</name>
<url>https://repo.maven.apache.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>

它会强制maven使用https://repo.maven.apache.org/maven2 url.

将此添加到 pom.xml 文件中。对我来说很好

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
    </pluginRepository>
</pluginRepositories>

<repositories>
    <repository>
        <id>central</id>
        <name>Central Repository</name>
        <url>https://repo.maven.apache.org/maven2</url>
        <layout>default</layout>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

我在最新版本(2020 年 8 月)中遇到了这个问题(在很久没有在这台机器上使用 Maven 之后)并且在阅读这些答案后摸不着头脑为什么它仍然是一个问题。

原来我的主目录中的 .m2/ 文件夹中有一个旧的 settings.xml,其中包含多年前的一些自定义设置。

但是,即使删除该文件也无法解决问题。我最终删除了整个 .m2 文件夹。
我认为除了下载的资源外,它没有其他任何东西。也许只删除像 repository/org/apache/maven/archetype 这样的文件夹就足够了。

我也出现了这个错误。我按照 Muhammad umer 上面所说的做了。但是,它只解决了 spring-boot-dependencies 和 spring-boot-dependencies 具有子依赖项的错误。现在,有 21 个错误。以前,它是 2 个错误。像这样:

Non-resolvable import POM: Could not transfer artifact org.springframework.cloud:spring-cloud-dependencies:pom:Hoxton.SR3 from/to central

错误消息中还需要 https。

我将 maven 版本从 3.2.2 更新到 3.6.3,java 版本从 8 更新到 11。现在,所有需要 https 的错误都消失了。

更新maven版本

  1. 从这里下载最新的 maven:download maven
  2. 解压并移动到/opt/maven/
  3. 设置路径export PATH=$PATH:/opt/maven/bin
  4. 并且,还从 PATH 中删除旧的 maven

以下link让我摆脱了困境,

https://support.sonatype.com/hc/en-us/articles/360041287334-Central-501-HTTPS-Required

您可以在您的 Maven 中进行更改,apache-maven/conf/settings。xml。 或者,如果您在 pom.xml 中指定,请在此处进行更改。

之前,

<repository>
            <id>maven_central_repo</id>
            <url>http://repo.maven.apache.org/maven2</url>
</repository>

现在,

<repository>
            <id>maven_central_repo</id>
            <url>https://repo.maven.apache.org/maven2</url>
</repository>

注意从 http 到 https 的变化

我下载了上次netbeans 12.2版本,问题解决

在旧的 grails 环境中,唯一无需升级即可工作的是:

settings.xml

   <settings>
    <mirrors>
        <mirror>
          <id>centralhttps</id>
          <mirrorOf>central</mirrorOf>
          <name>Maven central https</name>
          <url>http://insecure.repo1.maven.org/maven2/</url>
        </mirror>
      </mirrors>
  </settings>