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

从 3.8.1 版开始,Maven 默认阻止外部 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>
  <blocked>true</blocked>
</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>
            <blocked>false</blocked>
        </mirror>
    </mirrors>
</settings>

<mirrorOf>标签中的哪里需要指定id被阻止的仓库的,在<url>标签中再次指定仓库的原始url。您需要为您拥有的每个被阻止的存储库创建此解除阻止程序镜像。

例子:

如果您在 中定义了以下 HTTP 存储库pom.xml

<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>
        <blocked>false</blocked>
    </mirror>
    <mirror>
        <id>snapshot-http-unblocker</id>
        <mirrorOf>snapshots</mirrorOf>
        <name></name>
        <url>http://my-url/libs-snapshot</url>
        <blocked>false</blocked>
    </mirror>
</mirrors>

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


回答

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

PS 解除阻止所有不安全的 http 存储库是否是一个好主意是另一回事。


回答

就我而言,我只是添加了一个带有 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>
               <blocked>true</blocked>
         </mirror>
    </mirrors>
</settings>


回答

您应该只在您的 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>
            <blocked>false</blocked>
        </mirror>
    </mirrors>


以上是如何禁用maven阻止外部HTTP存储库?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>