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


154

最近,在Jenkins中运行的Maven构建作业失败,但出现以下异常,原因是它们无法从Maven Central提取依赖项,应使用HTTPS。我不确定如何将请求从HTTP更改为HTTPS。有人可以指导我吗?

[错误] 无法解析的构建扩展:
插件org.apache.maven.wagon:wagon-ssh:2.1或其依赖项之一无法解析:
无法收集以下项的依赖项org.apache.maven.wagon:wagon-ssh:jar:2.1 ()
无法读取以下项的工件描述符org.apache.maven.wagon:wagon-ssh:jar:2.1
无法org.apache.maven.wagon:wagon-ssh:pom:2.1从/到中央传输工件(http://repo.maven.apache。 org / maven2):
无法传输文件:http : //repo.maven.apache.org/maven2/org/apache/maven/wagon/wagon-ssh/2.1/wagon-ssh-2.1.pom
返回码为:501, ReasonPhrase:HTTPS Required. -> [Help 2]

等待Jenkins完成收集data[ERROR]
插件org.apache.maven.plugins:maven-clean-plugin:2.4.1或其依赖项之一无法解决:
无法读取工件描述符org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1
不能将工件org.apache.maven.plugins:maven-clean-plugin:pom:2.4.1从中央传输到中央(http://repo.maven.apache.org/maven2):
失败传输文件:http : //repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.4.1/maven-clean-plugin-2.4.1.pom
返回码为:501 , ReasonPhrase:HTTPS Required. -> [Help 1]


5
您正在使用repo.maven.apache.org/maven2网址连接到Maven中央站点,而是使用repo.maven.apache.org/maven2 即使用https连接
Manjunath HM

2
检查您settings.xml在jenkins中的Maven中央网址
varontron

嗨,Manjunath,我有同样的问题。您知道如何强制Maven使用HTTPS而非HTTP
Lahiru Madushanka

@Lahiru Madushanka经过联系,所以你得到的回答你的问题stackoverflow.com/questions/25393298/...
Manjunath HM

1
我已将Maven版本更改为3.6.3,但仍显示相同的错误
dhS

Answers:


129

Central 501 HTTPS Required中解释了观察到的错误的原因

从2020年1月15日开始,中央存储库不再支持通过纯HTTP进行的不安全通信,并且要求对存储库的所有请求都通过HTTPS进行加密。

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

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

您的Java版本可能会在1月13日开始中断(如果您尚未切换对HTTPS的回购访问权限)

更新:好像是从Maven 3.2.3开始的,通过HTTPS访问了Maven Central参见https://stackoverflow.com/a/25411658/5820670

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


26
嗨!我是发起这项全行业计划的原始研究员。:你可以找到我的博客文章关于这个重要的日子在这里也medium.com/@jonathan.leitschuh/...
乔纳森Leitschuh

1
@JonathanLeitschuh请写一个完整的答案,可以进行表决,并接受...
托尔比约恩Ravn的安德森

1
我在Ubuntu 18.04上使用了maven 3.6.0,但它似乎并未使用https url。
阿舒托什

@Ashutosh:与Ubuntu 19.10上的Maven 3.6.1相同。我不确定为什么会这样,它可能是Ubuntu补丁,但是为什么他们会这样做?)。要解决此问题,请使用下面的任何更新settings.xml文件的答案(并请对其进行投票,因为这是正确的解决方案,而不是使用修补的Maven)。
古斯

因此,我明确配置settings.xml为使用HTTPS存储库。它可以与HTTPS存储库一起使用wget,但是出于某些非常奇怪的原因mvn archetype:generate -X(仅测试是否可以下载依赖项),它仍然打印正在访问Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-clean-plugin/2.5/maven-clean-plugin-2.5.pom 任何帮助。
Giorgi Tsiklauri

61

我正面临着同样的问题。我尝试了两种解决方案,两种方法都对我有效。

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

更新Maven版本库:

下载包含默认https地址的Apache Maven二进制文件Apache Maven 3.6.3二进制文件)。并在NetBeans菜单栏的工具(Java Maven Dialog View)中打开“ 选项”对话框窗口。然后在“ Maven主页列表框”(“ Maven主页列表框视图”)中选择“浏览”选项。添加新下载的Apache Maven版本(“ 更新的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>

我有中央存储库,但没有中央插件存储库。这为我解决了。
思考2​​75

1
限制当前的Maven版本使用HTTPS链接:对我有用。
Mohammad Anas

就我而言,我错过了<pluginRepository>部分,使用原型时出现错误,因为插件默认为http。
user1708042

这也为我修复了它,但是我收到另一个错误“收到致命警报:protocol_version”,并且不得不切换到Java 8来修复它,以防万一有人偶然遇到同一问题。
金唐

我很高兴为打破平局做出了贡献。这个答案解决了我遇到的类似问题。
Brian Risk

36

从2020年1月15日开始,中央存储库不再支持通过纯HTTP进行的不安全通信,并且要求对存储库的所有请求都通过HTTPS加密

如果收到此错误,则需要用其规范的HTTPS对等替换所有对Maven Central的URL引用。

来源

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

旧:

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

新:

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

是的,我已经替换了setting.xml文件,但不幸的是它仍然无法正常工作。我做对了还是需要更改其他文件?
Sumeet Vishwas

@SumeetVishwas可以共享一个示例settings.xml文件吗?
Arunan Sugunakumar

3
@ArunanSugunakumar我没有在settings.xml中更改。您只需更改POM。更新Maven的中央存储库。我将中央存储库的样本放入应答线程。请在下面找到
Sumeet Vishwas

1
OP的问题是:“我不确定如何将请求从HTTP更改为HTTPS。” 这个答案没有解决这个问题。
wchargin

28

尝试在任何浏览器中点击以下URL。它将返回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>

1
您能否提供完整的setting.xml的示例,因为我尝试将以上内容添加到文件中而未成功?
jhertz

找到了使文件位置更清晰的答案,现在可以正常工作:stackoverflow.com/a/59784045/3120576
jhertz

22

更新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>

我在Pom中尝试了此方法,并且效果很好:<repositories> <repository> <id> central repo https </ id> <name> Central Repository Https </ name> <url> repo.maven.apache.org/maven2</ url > </ repository> </ repositories>。

1
谢谢。使用Netbeans在ubuntu 18.10中工作。必须将Maven设置为Netbeans中最新的Maven版本。您在哪里找到此解决方案?
Sanal S

您可能还必须更新插件存储库。至少还必须为我完成此操作才能修复。
金棠

16

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

对我来说,我必须cd $M2_HOME/confsettings.xml那里编辑文件。在里面添加以下块<mirrors>...</mirrors>

<mirror>
  <id>central-secure</id>
  <url>https://repo.maven.apache.org/maven2</url>
  <mirrorOf>central</mirrorOf>
</mirror>

您能否分享您的Dockerfile?我遇到了同样的问题,但我不知道该如何解决!
Han Van Pham

@HanVanPham我将我的Maven更新至最新版本,此HTTP问题已修复。
mehulmpt

对我来说,对本地settings.xml($ HOME / .m2 / settings.xml)文件中的中央安全块的调整也能很好地工作。
t3az0r


12

Maven正在转向HTTPS并禁用HTTP访问

简而言之,从2020年1月15日开始,Maven Central存储库不再支持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.3 在这里下载

对于Gradle:

仅替换HTTPS版本的URL。

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

要从3.3.9升级到3.6.3,是否需要先完全卸载旧版本?还是只安装最新版本?
BigRedEO

1
@BigRedEO您的环境中可以有多个Maven版本。但是,您$M2_HOME或您的$PATH env变量将仅指向其中之一,这将是您的默认Maven版本。我希望先卸载旧版本,然后再安装新版本。但是,这取决于您的需求。
Adam M. Gamboa G.

10

我将以下代码段添加到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>

9

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

  1. 我的项目在GitLab中,因此它使用.yml文件,该文件指向我必须进行持续集成的Docker映像,并且它使用的映像具有http:// maven URL。所以我将其更改为https:// maven
  2. 相同的Dockerfile映像具有较旧的Maven 3.0.1版本,使我一整夜都遇到了问题。我更新了Dockerfile以获取最新版本3.6.3
  3. 然后,我将该映像部署到了在线存储库,并更新了我的Maven项目ymlfile以使用该新映像。
  4. 最后,我更新了我的主要项目POM文件以引用https:// maven ...而不是http:// maven

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


您能否分享您的Dockerfile?
Han Van Pham

8

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

如果您不想/不能升级到Maven 3.2.3+,可以通过在您的计算机中添加以下代码来解决 MAVEN_HOME \ conf \ settings.xml中此问题<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中禁用/覆盖它,否则它将始终是一个活动设置。


7

对于所有公司编码人员,理想情况下,如果遇到此错误,则意味着您的代码库仍是从开源社区构建的。您需要与内部公司Maven存储库管理器一起使用“中央”存储库。

您可以转到settings.xml并覆盖中央存储库URL,从http://到https://

<M2_HOME>/conf/settings.xml

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

    <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/http://repo.maven.apache.org/maven2/然后

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

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

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

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


在“镜像”部分中添加镜像后,出现错误,该同级未通过身份验证。我现在该怎么办?谢谢!
戴森

@dimson这意味着您尝试与https连接,但是缺少用于身份验证的证书,可能是因为Java没有该证书。将证书从存储库导入Java密钥库,或升级Java。
tibortru

@tibortru Thanx Man,已经解决了这个问题。我已将以下属性添加到IDE中的maven中:maven.wagon.http.ssl.insecure = true maven.wagon.http.ssl.allowall = true maven.wagon.http.ssl.ignore.validity.dates = true https。协议= TLSv1,TLSv1.1,TLSv1.2。之后,一切正常。
戴森

是的,那是另一回事。非安全的一个:)
tibortru

7

对我(企业编码器)而言,还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>

您能否告诉我在哪里可以找到settings.xml文件@Oscar?
Han Van Pham

当然!在我们的Dockerfile中,我们首先将其放在这样的一个临时文件夹中:echo“ <settings> <mirrors> .... </ mirrors> </ settings>”> /tmp/maven-settings.xml。然后,使用“ -s”选项运行maven,并将路径传递到设置文件,例如“ mvn -s /tmp/maven-settings.xml clean”。希望能帮助到你!
奥斯卡·德莱

@ han-van-pham您可以在$ HOME / .m2 /中找到它。如果没有,请在那里创建它。
dr0i

4

使用Ubuntu 16.04,java 1.8.0_201。

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

意识到这可能是与要求https相关的信任库/密钥库问题。发现您现在可以使用jvm.config文件配置-Djavax选项,请参见:https ://maven.apache.org/configure.html

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

还有一个选项可以在“ export MAVEN_OPTS”中使用此配置(使用mvn generate时),但是尽管这停止了501错误,但它创建了另一个错误:它期望一个pom文件。

创建单独的jvm.config文件可以完美地工作,只需将其放在项目的根目录中即可。

希望这可以帮助某人,花了我整天的时间来解决!


4

同样的问题也发生在jcenter上

从2020年1月13日起,仅在HTTPS上提供Jcenter。

使用相同的项目获得依赖的项目将开始面临问题。要快速修复,请在build.gradle中执行以下操作

代替

repositories {
jcenter ()
//others
}

用这个:

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

4

错误:

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

返回码是: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文件中。


2
我在哪里替换此网址
dhS

3

如果有人需要,请共享:

旧的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。快乐的编码:)


3

我当前的环境不支持HTTPS,因此添加不安全版本的存储库解决了我的问题:根据Sonatype http://insecure.repo1.maven.org

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

-3

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>

这将导致相同的问题,因为它正在使用http
Yudhistira Arya

1
我在Pom中尝试了此方法,此方法正在发挥作用
Sathesh

我也尝试过并工作x2
Javier J Solis Flores
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.