禁用 Maven 中央存储库

我公司的政策不允许自动下载工件(它们必须得到批准) ,因此为了使用 Maven,我需要禁用对 Maven 中央存储库的访问。

换句话说,我不希望 Maven 尝试从中央下载 任何

我知道如何配置本地存储库(无论是否联网) ,我的想法是使用一个“受祝福的”机器来更新本地存储库。

PS: 我可以在代理/网络级别上阻止请求,但是我想知道如何使用 Maven 的配置来做到这一点。

更新 在 Maven 的主页中,在 conf目录中有一个全局 settings.xml。 您可以将镜像设置为指向某个内部服务器的 central,也可以只覆盖它的定义。

86826 次浏览

同意。在您的版本构建中不允许从外部存储库直接下载。

你问题的具体答案是我答案的第二部分: -)

设置存储库管理器

我建议设置一个本地 Maven 存储库管理器:

所有这些都可以作为外部可用的 Maven 中心 jar 的缓存代理。

您可能还对专业版的 Nexus 感兴趣。它包括一个用于管理外部库的 采购套房。它还提供了集中管理 Maven 设置文件的 Maven 插件,这是我的答案的第二部分..。

本地 Maven 设置

更新位于以下目录中的 设置文件:

$HOME/. m2/setings.xml

指定所有中央请求都应该重定向到本地 Maven 存储库:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
...
<mirrors>
<mirror>
<id>central-proxy</id>
<name>Local proxy of central repo</name>
<url>http://<hostname>/central</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
...
</settings>

最简单的方法是使用-o 参数,它告诉 maven 在脱机模式下运行。当然,您需要确保您的本地回购具有您需要的一切,但这至少排除了任何安全问题,您可能会自动连接到一个未经批准的回购。

对于应该处理所有工件请求的公司范围的存储库,您可以配置单个存储库来镜像 $MAVEN_HOME/conf/settings.xml中的所有内容:

<mirror>
<id>internal-repository</id>
<name>Maven Repository Manager running on repo.mycompany.com</name>
<url>http://repo.mycompany.com/proxy</url>
<mirrorOf>*</mirrorOf>
</mirror>

来源

我觉得 配置工件解析页很有用。 它说明了关于“镜像任意”-setup 的以下内容。

不要使用“镜像任何”本身,作为您唯一的决议规则。使用它来强制执行严格通过 ArtiFactory 完成的任何工件解决方案。 “镜像任何”代理配置适用于已定义的存储库。它将取代(但不隐藏)内置的中央和快照存储库,除非被用户重写。它定义了一个粗粒度的代理规则,该规则不区分版本和快照,并且依赖于定义的存储库来执行这个解析过滤。

玛文的超级 POM定义了中央存储库。下面是如何覆盖中央存储库和插件存储库的发布和快照:

<repositories>
<repository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://repo1.maven.org/maven2</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

当然,您应该配置一个替换,正如已接受的答案所说明的那样。

我也有同样的问题,不过是因为别的原因。解决方案是停用 Avira 浏览器保护(在德国的 Browser-Schutz)。我从 M2e 不能从 nexus 传输元数据,但 maven 命令行可以中提取了溶液。

听起来好像有人正在积极地试图执行您的开放源代码治理政策。

同意这里关于使用内部存储库管理器托管 Maven 需要的组件的其他评论。

正如 Rory 提到的,在停止访问 Maven Central (The Central Repository)或任何其他公共开放源码存储库之前,需要确保存储库中具备所需的所有内容。

Mark 对 Nexus 的采购能力提出了一个很好的观点。一旦内部回购管理器建立了你所有的“批准”的组件,你也可以打开 Nexus 仓库健康检查功能(它是免费的) ,报告所有的组件许可证,已知的安全漏洞等组件在你的回购。

老实说,我为 Sonatype 工作。

在过去,我发现最健壮的解决方案是手动覆盖内置的存储库。我发现这种方法比更改父 POM、 setings.xml、镜像或概要文件更好。对于所有内部项目,将以下设置放入其 POM 中。

<repositories>
<repository>
<id>central</id>
<url>http://internalrepo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>snapshots</id>
<url>http://internalrepo</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://internalrepo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>snapshots</id>
<url>http://internalrepo</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>