Maven 自 3.8.1 版起默认阻止外部 HTTP 存储库(参见 https://maven.apache.org/docs/3.8.1/release-notes.html)
有没有办法禁用它或从这个规则中豁免仓库?
答案 0 :(得分:32)
通过检查负责默认 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>
标签中,您需要指定被阻止的存储库,在 <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>
<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>
我希望我的工作可以帮助其他偶然发现此问题的人。但是,如果您有更优雅或更好的解决方案,请分享!
答案 1 :(得分:10)
另一种可能的解决方案/变通方法是通过注释掉 maven 'main' "
文件(在let str = "I bought 4\" plywood from a\" store";
let match = str.match(/([A-Za-z]")/i);
let res = str.replace(/([A-Za-z]")/i, match[0].replace("\"", ""));
console.log(res);
就我而言);
maven-default-http-blocker
附言解除对所有不安全的 http 存储库的阻止是否是一个好主意是另一回事。
答案 2 :(得分:4)
就我而言,我只是添加了一个 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>
答案 3 :(得分:2)
您应该只在您的 http 存储库中添加一个镜像,以在您的 Maven 设置中允许 http。您不应该消除所有存储库的默认 maven 行为。然后告诉您的 DevOps 团队使用 https!
在mount_uploaders :attached_files, AttachedFileUploader, validate_integrity: true
中:
.m2/settings.xml