如何禁用 Maven 阻止外部 HTTP 存储库?
How to disable maven blocking external HTTP repositories?
Maven 自版本 3.8.1 起默认阻止外部 HTTP 存储库(参见 https://maven.apache.org/docs/3.8.1/release-notes.html)
有没有办法禁用它或使存储库不受此规则约束?
我通过检查负责默认 HTTP 阻止的 Maven git 存储库中的提交找到了解决方案:https://github.com/apache/maven/commit/907d53ad3264718f66ff15e1363d76b07dd0c05f
我的解决方法如下:
在 Maven 设置中(位于 ${maven.home}/conf/settings.xml
或 ${user.home}/.m2/settings.xml
),必须删除以下条目:
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
</mirror>
如果你在一个项目中工作并且不能确保 Maven 设置总是那样,例如因为你要和其他人共享代码或者想使用CI/CD进行自动化测试,你可以做如下:在项目中添加一个名为.mvn
的目录。在 .mvn
目录中,添加一个名为 maven.config
的文件,内容为 --settings ./.mvn/local-settings.xml
。在 .mvn
目录中,添加一个名为 local-settings.xml
的文件。该文件应如下所示:
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://........</url>
</mirror>
</mirrors>
</settings>
在<mirrorOf>
标签里面,你需要指定被屏蔽仓库的id
,在<url>
标签里,你指定原来的url再次存储库。您需要为每个被阻止的存储库创建此解锁镜像。
示例:
如果您在 pom.xml
中定义了以下 HTTP 存储库:
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>http://my-url/libs-release</url>
</repository>
<repository>
<id>snapshots</id>
<name>libs-snapshot</name>
<url>http://my-url/libs-snapshot</url>
</repository>
</repositories>
那么你需要在.mvn/local-settings.xml
:
<mirrors>
<mirror>
<id>release-http-unblocker</id>
<mirrorOf>central</mirrorOf>
<name></name>
<url>http://my-url/libs-release</url>
</mirror>
<mirror>
<id>snapshot-http-unblocker</id>
<mirrorOf>snapshots</mirrorOf>
<name></name>
<url>http://my-url/libs-snapshot</url>
</mirror>
</mirrors>
我希望我的工作可以帮助其他偶然发现此问题的人。但是,如果您有更优雅或更好的解决方案,请分享!
另一个可能的 solution/workaround 是通过注释掉 Maven 'main' <mirrors>
部分中的 maven-default-http-blocker
镜像来覆盖新的默认 http 阻塞行为 settings.xml
文件(在我的例子中在 /opt/maven/conf
下);
<!--mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>false</blocked>
</mirror-->
P.S。取消阻止所有不安全的 http 存储库是否是一个好主意是另一回事。
您应该只在您的 http 存储库中添加一个镜像,以便在您的 maven 设置中允许 http。您不应该消除所有存储库的默认 maven 行为。然后告诉你的 devops 团队使用 https!
在.m2/settings.xml
中:
<mirrors>
<mirror>
<id>my-repo-mirror</id>
<name>My Repo HTTP Mirror</name>
<url>http://url-to.my/repo</url>
<mirrorOf>my-repo</mirrorOf>
</mirror>
</mirrors>
在我的例子中,我只是添加了一个 ID 为 maven-default-http-blocker
的虚拟镜像来覆盖现有镜像。这将禁用所有存储库的 HTTP 阻止。
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>dummy</mirrorOf>
<name>Dummy mirror to override default blocking mirror that blocks http</name>
<url>http://0.0.0.0/</url>
</mirror>
</mirrors>
</settings>
如果您使用的是 Maven 版本 3.8 或更高版本,则不支持 HTTP。尝试使用较低版本或将 repo 升级到 HTTPS 有关更多信息,请参阅
https://help.mulesoft.com/s/article/Maven-error-when-building-application-Blocked-Mirror-for-repositories#:~:text=Upgrade%20the%20Maven%20repository%20so,of%20the%20obsolete%20HTTP%20one.&text=Define%20a%20mirror%20in%20your%20settings.&text=Define%20an%20exception%20for%20a%20specific%20repository.&text=The%20false%3C%2F,be%20used%20as%20an%20exception.
您可以遵循 Maven 文档中的官方推荐,它在您分享的 link 中有解释:https://maven.apache.org/docs/3.8.1/release-notes.html#how-to-fix-when-i-get-a-http-repository-blocked
Options to fix are:
upgrade the dependency version to a newer version that replaced the
obsolete HTTP repository URL with a HTTPS one,
keep the dependency version but define a mirror in your settings.
它包括一个link到Maven - Guide to Mirror Settings
如其他人所述,您不应覆盖默认安全设置。
一个对我有帮助的有点不同的解决方案,与我们的公司环境更相关,涉及到我们正在慢慢从 maven 转移到另一个 dep/build 工具的事实,但仍然有一个 'corporate' settings.xml
文件已定义。
所以只需将它重命名为不同的文件(而不是删除),例如 mv settings.xml settings-backup.xml
,然后再次返回 maven 将帮助您检查是否是问题所在。
在 macOS Monterey 中,使用 Intellij Ultimate 2021.3(及更高版本),系统中未安装 maven 并在 Intellij 中使用 maven 作为插件,我在路径中找到了“settings.xml”文件:
${user.home}/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.5744.223/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf/settings.xml
注: 以上路径为使用Jetbrains Toolbox App安装Intellij时,版本指定的数字 (213.5744.223) 可以延迟,如果您有其他版本,请在移动文件路径时验证。
用您喜欢的编辑器打开“settings.xml”文件,然后注释下一行:
<!--<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>-->
希望对您有所帮助。
取消阻止特定的 HTTP 存储库
要取消阻止特定存储库,您可以在设置中定义它的虚拟镜像,方法是添加具有相同 url
的 <mirror>
,其 <mirrorOf>
值与您存储库的匹配id
。无需更改任何其他内容即可正常工作。
例如:
如果您的仓库 ID 是 team-internal-repo,那么添加到您的 ~/.m2/settings.xml
的镜像可能如下所示:
<settings>
...
<!-- Add a mirror. -->
<mirrors>
<mirror>
<id>team-internal-repo-mirror</id>
<mirrorOf>team-internal-repo</mirrorOf> <!-- Must match repository id. -->
<name>Dummy mirror to unblock the team repo server</name>
<url>http://insecure-internal-server/repository/team-repo/</url>
<!-- <blocked>false</blocked> --> <!-- This is not needed, the mirror is unblocked by default. -->
</mirror>
</mirrors>
<!-- Existing profile does not need to change. -->
<profiles>
<profile>
<id>default_profile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>team-internal-repo</id>
<name>Dev Team Internal Artifacts</name>
<url>http://insecure-internal-server/repository/team-repo/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
...
</profile>
</profiles>
</settings>
这里不需要<blocked>
标签。其他用户评论说该标签破坏了旧版本的 maven。我测试了一个带和不带这个标签的 http repo,它在两种情况下都有效。 (使用 maven 3.8.2 测试。)
取消阻止一个或多个显式存储库比普遍取消阻止所有 http 存储库更好。这样做可能不是一个好主意:
- 它带来了更大的安全风险。 apache 进行此更改是有原因的,OP 引用的发行说明中对此进行了讨论:https://maven.apache.org/docs/3.8.1/release-notes.html#cve-2021-26291
- 修改您的 Maven 安装的内部配置(即
/opt/apache-maven-3.8.1
中的设置文件而不是 ~/.m2
中您自己的设置文件)可能会让人头疼更新或重新安装 Maven 的未来版本。如果该文件被覆盖,您的存储库可能会突然再次被阻止。
我在安装新版本的maven时遇到了这个问题。通过将 .m2 目录重命名为 .m2-old 然后再次 运行 maven 来修复此问题。它将重新创建目录,缺点是它将重新下载所有 jar,因为新的 .m2 是空的。然后将您的 settings.xml 转移到那个新的 .m2 目录。
我还没有测试将存储库目录从旧的 .m2 复制到新的是否可以正常工作。
更新:将存储库目录从 ~/.m2-old 复制到新的 ~/.m2 之后 运行ning maven
时没有导致任何错误
有时候,当你本地的settings.xml版本低,而你的maven版本高于那个,那么去掉这个配置也解决不了问题:
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://........</url>
</mirror>
也许看看添加<blocked>false</blocked>
是否会解决问题:
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://your blocked url</url>
<blocked>false</blocked>
</mirror>
</mirrors>
我通过简单地将 .xml 文件中的 "http"
替换为 "https"
解决了这个问题(在我的例子中是 pom.xml)。
这解决了我的错误。
使用捆绑的 maven (3.8.1) 的 macOS Monterey 12.3.1 和 IntelliJ 2022.1 存在同样的问题。该解决方案与 MrBitwise 提出的解决方案类似,但设置文件的路径不同(它是嵌入在应用程序内容文件夹中的路径):
/Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/maven/lib/maven3/conf/settings.xml
然后我注释了下面的代码:
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>
Maven 自版本 3.8.1 起默认阻止外部 HTTP 存储库(参见 https://maven.apache.org/docs/3.8.1/release-notes.html)
有没有办法禁用它或使存储库不受此规则约束?
我通过检查负责默认 HTTP 阻止的 Maven git 存储库中的提交找到了解决方案:https://github.com/apache/maven/commit/907d53ad3264718f66ff15e1363d76b07dd0c05f
我的解决方法如下:
在 Maven 设置中(位于 ${maven.home}/conf/settings.xml
或 ${user.home}/.m2/settings.xml
),必须删除以下条目:
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
</mirror>
如果你在一个项目中工作并且不能确保 Maven 设置总是那样,例如因为你要和其他人共享代码或者想使用CI/CD进行自动化测试,你可以做如下:在项目中添加一个名为.mvn
的目录。在 .mvn
目录中,添加一个名为 maven.config
的文件,内容为 --settings ./.mvn/local-settings.xml
。在 .mvn
目录中,添加一个名为 local-settings.xml
的文件。该文件应如下所示:
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://........</url>
</mirror>
</mirrors>
</settings>
在<mirrorOf>
标签里面,你需要指定被屏蔽仓库的id
,在<url>
标签里,你指定原来的url再次存储库。您需要为每个被阻止的存储库创建此解锁镜像。
示例:
如果您在 pom.xml
中定义了以下 HTTP 存储库:
<repositories>
<repository>
<snapshots>
<enabled>false</enabled>
</snapshots>
<id>central</id>
<name>libs-release</name>
<url>http://my-url/libs-release</url>
</repository>
<repository>
<id>snapshots</id>
<name>libs-snapshot</name>
<url>http://my-url/libs-snapshot</url>
</repository>
</repositories>
那么你需要在.mvn/local-settings.xml
:
<mirrors>
<mirror>
<id>release-http-unblocker</id>
<mirrorOf>central</mirrorOf>
<name></name>
<url>http://my-url/libs-release</url>
</mirror>
<mirror>
<id>snapshot-http-unblocker</id>
<mirrorOf>snapshots</mirrorOf>
<name></name>
<url>http://my-url/libs-snapshot</url>
</mirror>
</mirrors>
我希望我的工作可以帮助其他偶然发现此问题的人。但是,如果您有更优雅或更好的解决方案,请分享!
另一个可能的 solution/workaround 是通过注释掉 Maven 'main' <mirrors>
部分中的 maven-default-http-blocker
镜像来覆盖新的默认 http 阻塞行为 settings.xml
文件(在我的例子中在 /opt/maven/conf
下);
<!--mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>false</blocked>
</mirror-->
P.S。取消阻止所有不安全的 http 存储库是否是一个好主意是另一回事。
您应该只在您的 http 存储库中添加一个镜像,以便在您的 maven 设置中允许 http。您不应该消除所有存储库的默认 maven 行为。然后告诉你的 devops 团队使用 https!
在.m2/settings.xml
中:
<mirrors>
<mirror>
<id>my-repo-mirror</id>
<name>My Repo HTTP Mirror</name>
<url>http://url-to.my/repo</url>
<mirrorOf>my-repo</mirrorOf>
</mirror>
</mirrors>
在我的例子中,我只是添加了一个 ID 为 maven-default-http-blocker
的虚拟镜像来覆盖现有镜像。这将禁用所有存储库的 HTTP 阻止。
<settings xmlns="http://maven.apache.org/SETTINGS/1.2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.2.0 http://maven.apache.org/xsd/settings-1.2.0.xsd">
<mirrors>
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>dummy</mirrorOf>
<name>Dummy mirror to override default blocking mirror that blocks http</name>
<url>http://0.0.0.0/</url>
</mirror>
</mirrors>
</settings>
如果您使用的是 Maven 版本 3.8 或更高版本,则不支持 HTTP。尝试使用较低版本或将 repo 升级到 HTTPS 有关更多信息,请参阅 https://help.mulesoft.com/s/article/Maven-error-when-building-application-Blocked-Mirror-for-repositories#:~:text=Upgrade%20the%20Maven%20repository%20so,of%20the%20obsolete%20HTTP%20one.&text=Define%20a%20mirror%20in%20your%20settings.&text=Define%20an%20exception%20for%20a%20specific%20repository.&text=The%20false%3C%2F,be%20used%20as%20an%20exception.
您可以遵循 Maven 文档中的官方推荐,它在您分享的 link 中有解释:https://maven.apache.org/docs/3.8.1/release-notes.html#how-to-fix-when-i-get-a-http-repository-blocked
Options to fix are:
upgrade the dependency version to a newer version that replaced the obsolete HTTP repository URL with a HTTPS one,
keep the dependency version but define a mirror in your settings.
它包括一个link到Maven - Guide to Mirror Settings
如其他人所述,您不应覆盖默认安全设置。
一个对我有帮助的有点不同的解决方案,与我们的公司环境更相关,涉及到我们正在慢慢从 maven 转移到另一个 dep/build 工具的事实,但仍然有一个 'corporate' settings.xml
文件已定义。
所以只需将它重命名为不同的文件(而不是删除),例如 mv settings.xml settings-backup.xml
,然后再次返回 maven 将帮助您检查是否是问题所在。
在 macOS Monterey 中,使用 Intellij Ultimate 2021.3(及更高版本),系统中未安装 maven 并在 Intellij 中使用 maven 作为插件,我在路径中找到了“settings.xml”文件:
${user.home}/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/213.5744.223/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/conf/settings.xml
注: 以上路径为使用Jetbrains Toolbox App安装Intellij时,版本指定的数字 (213.5744.223) 可以延迟,如果您有其他版本,请在移动文件路径时验证。
用您喜欢的编辑器打开“settings.xml”文件,然后注释下一行:
<!--<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>-->
希望对您有所帮助。
取消阻止特定的 HTTP 存储库
要取消阻止特定存储库,您可以在设置中定义它的虚拟镜像,方法是添加具有相同 url
的 <mirror>
,其 <mirrorOf>
值与您存储库的匹配id
。无需更改任何其他内容即可正常工作。
例如:
如果您的仓库 ID 是 team-internal-repo,那么添加到您的 ~/.m2/settings.xml
的镜像可能如下所示:
<settings>
...
<!-- Add a mirror. -->
<mirrors>
<mirror>
<id>team-internal-repo-mirror</id>
<mirrorOf>team-internal-repo</mirrorOf> <!-- Must match repository id. -->
<name>Dummy mirror to unblock the team repo server</name>
<url>http://insecure-internal-server/repository/team-repo/</url>
<!-- <blocked>false</blocked> --> <!-- This is not needed, the mirror is unblocked by default. -->
</mirror>
</mirrors>
<!-- Existing profile does not need to change. -->
<profiles>
<profile>
<id>default_profile</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<repositories>
<repository>
<id>team-internal-repo</id>
<name>Dev Team Internal Artifacts</name>
<url>http://insecure-internal-server/repository/team-repo/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
...
</profile>
</profiles>
</settings>
这里不需要<blocked>
标签。其他用户评论说该标签破坏了旧版本的 maven。我测试了一个带和不带这个标签的 http repo,它在两种情况下都有效。 (使用 maven 3.8.2 测试。)
取消阻止一个或多个显式存储库比普遍取消阻止所有 http 存储库更好。这样做可能不是一个好主意:
- 它带来了更大的安全风险。 apache 进行此更改是有原因的,OP 引用的发行说明中对此进行了讨论:https://maven.apache.org/docs/3.8.1/release-notes.html#cve-2021-26291
- 修改您的 Maven 安装的内部配置(即
/opt/apache-maven-3.8.1
中的设置文件而不是~/.m2
中您自己的设置文件)可能会让人头疼更新或重新安装 Maven 的未来版本。如果该文件被覆盖,您的存储库可能会突然再次被阻止。
我在安装新版本的maven时遇到了这个问题。通过将 .m2 目录重命名为 .m2-old 然后再次 运行 maven 来修复此问题。它将重新创建目录,缺点是它将重新下载所有 jar,因为新的 .m2 是空的。然后将您的 settings.xml 转移到那个新的 .m2 目录。
我还没有测试将存储库目录从旧的 .m2 复制到新的是否可以正常工作。
更新:将存储库目录从 ~/.m2-old 复制到新的 ~/.m2 之后 运行ning maven
时没有导致任何错误有时候,当你本地的settings.xml版本低,而你的maven版本高于那个,那么去掉这个配置也解决不了问题:
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://........</url>
</mirror>
也许看看添加<blocked>false</blocked>
是否会解决问题:
<mirrors>
<mirror>
<id>my-repository-http-unblocker</id>
<mirrorOf>my-blocked-http-repository</mirrorOf>
<name></name>
<url>http://your blocked url</url>
<blocked>false</blocked>
</mirror>
</mirrors>
我通过简单地将 .xml 文件中的 "http"
替换为 "https"
解决了这个问题(在我的例子中是 pom.xml)。
这解决了我的错误。
使用捆绑的 maven (3.8.1) 的 macOS Monterey 12.3.1 和 IntelliJ 2022.1 存在同样的问题。该解决方案与 MrBitwise 提出的解决方案类似,但设置文件的路径不同(它是嵌入在应用程序内容文件夹中的路径):
/Applications/IntelliJ\ IDEA\ CE.app/Contents/plugins/maven/lib/maven3/conf/settings.xml
然后我注释了下面的代码:
<mirror>
<id>maven-default-http-blocker</id>
<mirrorOf>external:http:*</mirrorOf>
<name>Pseudo repository to mirror external repositories initially using HTTP.</name>
<url>http://0.0.0.0/</url>
<blocked>true</blocked>
</mirror>