如何禁用 Maven 阻止外部 HTTP 存储库?

Posted

技术标签:

【中文标题】如何禁用 Maven 阻止外部 HTTP 存储库?【英文标题】:How to disable maven blocking external HTTP repositories? 【发布时间】:2021-07-04 04:54:05 【问题描述】:

Maven 自 3.8.1 版起默认阻止外部 HTTP 存储库(请参阅https://maven.apache.org/docs/3.8.1/release-notes.html

有没有办法禁用它或使存储库不受此规则的约束?

【问题讨论】:

您在公司环境中吗?如果是这样配置<mirrorOf>*</mirrorOf> 并重定向到您的内部存储库管理器? @khmarbaise 我找到了一个解决方案(请参阅我的答案),其中我为每个被阻止的存储库显式配置了一个镜像。使用您的解决方案,为mirrorOf 使用通配符,我无法区分存储库,例如每个快照和版本一个。或者我可以吗? 你可以。请参阅help.sonatype.com/repomanager3/formats/maven-repositories(settings.xml 文件)...如果我找到新的存储库,mirrorOf 可以帮助我防止更改某些内容...维护...所有请求都被重定向到存储库管理器,该存储库管理器已经阻止了所有内容...还有我永远不会在.mvn 中添加settings.xml 更好地使用配置文件提供程序插件(Jenkins)来处理包括。凭据....永远不允许在 pom 文件中定义 repos... @khmarbaise 我明白你的意思。我同意,这将是一个更好的配置。但是,我的情况不同,我需要使用我所拥有的。我有 20 个项目,在每个 pom 文件中,都定义了存储库。并且由于 maven 更新到 3.8.1,所有构建都失败了,因为存储库是 HTTP,而不是 HTTPS。我使用 JFrog Artifactory 作为回购经理 有一个简单的方法:使用 Maven 3.6.3。 ;-) 【参考方案1】:

我通过检查负责默认 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>

&lt;mirrorOf&gt;标签里面,你需要指定被阻塞仓库的id,在&lt;url&gt;标签里面,你又要指定仓库的原始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>

我希望我的工作可以帮助其他偶然发现这一点的人。但是,如果您有更优雅或更好的解决方案,请分享!

【讨论】:

是否可以通过通配符解锁所有被阻止的repos? 我不知道为什么没人这么说,但是你的存储库 id 应该与 mirrorOf 值匹配,然后它就会起作用 @Sebu 存储库也有名称,除了 id,mirrorOf 需要 Id 而不是名称,但感谢您的回答,也许只是我遇到了麻烦 @BorisMitioglov 我更新了我的答案以包含您的注释。感谢您指出,我想这不是那么清楚。 另一种选择是覆盖~/.m2/settings.xml 中的&lt;mirrors&gt; 块。这不需要修改 maven 安装,并且仍然全局应用(不是每个项目)。与修改后的 maven 安装相比,此文件还可以更轻松地部署到您的 CI 基础架构(并且它适用于机器上的所有 maven 副本)【参考方案2】:

就我而言,我只是添加了一个 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>

【讨论】:

我建议删除 "true" 以便旧的 maven 版本不会因为不知道被阻止的标签而抱怨。 哇,这太聪明了。我喜欢这个! 我们正在使用一个 s3 存储库 wagong,它也被那个新的 http 拦截器阻止了【参考方案3】:

另一种可能的解决方案/解决方法是通过在 maven 的“主”settings.xml 文件的 &lt;mirrors&gt; 部分中注释掉 maven-default-http-blocker 镜像来覆盖新的默认 http 阻止行为(在我的情况下是 /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-->

附:解锁所有不安全的 http 存储库是否是一个好主意是另一回事。

【讨论】:

最佳答案! 像魅力一样工作......谢谢【参考方案4】:

您应该只在您的 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>

【讨论】:

我不确定为什么我的答案被编辑以删除&lt;blocked&gt;false&lt;/blocked&gt;,因为一旦他们开始需要 https,问题就出在 maven 3.8.1+ 上,其中被阻止的标签绝对可用。哦,好吧【参考方案5】:

在 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>-->

希望对您有所帮助。

【讨论】:

【参考方案6】:

如果您使用的是 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.

【讨论】:

【参考方案7】:

您可以遵循 Maven 文档中的官方建议,在您共享的同一链接中进行了说明:https://maven.apache.org/docs/3.8.1/release-notes.html#how-to-fix-when-i-get-a-http-repository-blocked

要修复的选项是:

将依赖版本升级到替换 带有 HTTPS 的过时 HTTP 存储库 URL,

保留依赖版本,但在您的设置中定义镜像。

它包含一个指向Maven - Guide to Mirror Settings的链接

正如其他人提到的,您不应覆盖默认安全设置。

【讨论】:

【参考方案8】:

有点不同的解决方案对我有所帮助,与我们的企业环境更相关,涉及我们正在慢慢从 maven 迁移到另一个 dep/build 工具的事实,但仍然有一个“企业”settings.xml 文件已定义。

所以只需将其重命名为不同的文件(而不是删除),例如 mv settings.xml settings-backup.xml,然后再次返回 maven 将帮助您检查是否是问题所在。

【讨论】:

【参考方案9】:

取消阻止特定的 HTTP 存储库

要取消阻止特定存储库,您可以在设置中定义它的虚拟镜像,方法是添加具有相同url&lt;mirror&gt;,其&lt;mirrorOf&gt; 值与存储库的id 匹配。无需进行任何其他更改即可使其正常工作。

例如: 如果您的 repo 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>

这里不需要&lt;blocked&gt; 标签。其他用户评论说该标签破坏了旧版本的 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 时让人头疼。如果该文件被覆盖,您的 repo 可能会突然再次被阻止。

【讨论】:

以上是关于如何禁用 Maven 阻止外部 HTTP 存储库?的主要内容,如果未能解决你的问题,请参考以下文章

阻止 Jenkins 将工件安装到本地 Maven 存储库

如何阻止 Jenkins 中的 CI 构建意外发布到发布存储库?

存储库中的文件阻止 IntelliJ 使用星形导入

如何暂时禁用 git http 代理

sh 在maven存储库中安装外部库jar

如何在 kscript (Kotlin) 中使用外部存储库?