我如何配置 Maven 以应对 corporate/VPN 和 public 存储库设置?
How can I configure the maven to cope with both corporate/VPN and public repository setups?
我需要一个能够编译 Java Maven 项目的设置:
- 企业 Maven 存储库(内网 Artifactory 代理 Maven Central 和其他)
- public Maven 存储库(Central、ICM、io.confluent 等)
项目 POM 代码已经引用内部公司存储库:
<repositories>
<repository>
<id>artifactory-virtual</id>
<name>My Artifactory Repository to download</name>
<url>https://artifactory.corporation.com/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
但是要使用此存储库需要 VPN 连接,我想避免。
我正在尝试使用 this Maven documentation.
设置存储库镜像
因此我在 ~/.m2/settings.xml
中配置以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
...
<mirrors>
<mirror>
<id>icm-mirror</id>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
<mirrorOf>*,!central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
但只是单独提供一个镜像(除了 central 之外的所有 repos),该项目仍在尝试从公司存储库下载(我没有提供任何):
[ERROR] Failed to execute goal on project ibis-customer-management:
Could not resolve dependencies for project com.example.project:myproject:jar:3.7.1-SNAPSHOT:
Failed to collect dependencies at com.oracle.jdbc:ojdbc8:jar:18.3.0.0:
Failed to read artifact descriptor for com.oracle.jdbc:ojdbc8:jar:18.3.0.0: Could not transfer artifact com.oracle.jdbc:ojdbc8:pom:18.3.0.0 from/to artifactory-virtual (https://artifactory.corporation.com/maven):
Transfer failed for https://artifactory.corporation.com/maven/com/oracle/jdbc/ojdbc8/18.3.0.0/ojdbc8-18.3.0.0.pom:
Connect to artifactory.corporation.com [artifactory.corporation.com/1.2.3.4] failed:
Operation timed out -> [Help 1]
即使我使用 ICM 存储库的显式条目创建活动配置文件,该错误也未修复:
<settings>
...
<mirrors>
<mirror>
<id>icm-mirror</id>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
<mirrorOf>*,!central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>not-corpnet</id>
<repositories>
<repository>
<id>icm</id>
<name>ICM Repository</name>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>not-corpnet</activeProfile>
</activeProfiles>
...
</settings>
如果您认为我的 settings.xml
中可能还有其他内容,上面的几乎是完整的(没有点,并且具有正确的 XML 命名空间。
当我 运行 mvn
时,个人资料也处于活动状态并且可见
[INFO] --- maven-help-plugin:3.2.0:active-profiles (default-cli) @ myproject ---
[INFO]
Active Profiles for Project 'com.example.project:myproject:pom:3.7.1-SNAPSHOT':
The following profiles are active:
- not-corpnet (source: external)
当我不在公司 network/VPN 中时,如何使我的项目(其 POM 已包含在公司存储库中)从 public 个存储库下载工件?
通过执行以下操作,我们终于达到了在 public 和企业网络中以相同方式工作的 OK 设置:
项目 pom.xml
包含所需的 public 存储库:
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo1.maven.org/maven2/</url>
</repository>
<repository>
<id>icm</id>
<name>ICM Repository</name>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
</repository>
<repository>
<id>confluent</id>
<name>Confluent Repository</name>
<url>http://packages.confluent.io/maven/</url>
</repository>
</repositories>
假设项目不需要非 public 依赖项,这将允许 "checkout and run" 在 public 环境中的工作方式。
如果我们在公司网络内部(可以访问私有存储库)并且在公司代理后面,我们使用每个开发人员都可以使用的 settings.xml
文件(~/.m2/serttings.xml
) 用于企业环境内部的发展。此文件包含 <proxies>
和 <mirrors>
:
<mirrors>
<mirror>
<id>internal-repository-mirror</id>
<name>Maven Mirror</name>
<url>https://artifactory.corporation.com/maven</url>
<mirrorOf>*,!confluent</mirrorOf>
</mirror>
<mirror>
<id>internal-confluent-mirror</id>
<name>Confluent Mirror</name>
<url>https://artifactory.corporation.com/confluent-maven</url>
<mirrorOf>confluent</mirrorOf>
</mirror>
</mirrors>
<proxies>
<proxy>
<id>corpnet-http-proxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.corporation.com</host>
<port>8079</port>
<nonProxyHosts>artifactory.corporation.com</nonProxyHosts>
</proxy>
<proxy>
<id>corpnet-https-proxy</id>
<active>true</active>
<protocol>https</protocol>
<host>proxy.corporation.com</host>
<port>8079</port>
<nonProxyHosts>artifactory.corporation.com</nonProxyHosts>
</proxy>
</proxies>
settings.xml
文件中不需要其他存储库或配置文件。
关于如何以自动方式交换 settings.xml
,我使用以下适合我始终打开终端的工作方式的方法:
- 当我启动终端时 window/tab 正在执行
~/.bash_profile
(或等效)
- 取决于我所在的网络(public 或 corporate/VPN)我 copy/overwrite 我准备的两个现有
settings.xml
文件之一:
** settings-public.xml
几乎是空的(可能有一些我在 playing/experimenting 代码中使用的特殊存储库)
** settings-corpnet.xml
至少包含上面指出的 <mirrors>
和 <proxies>
部分
我需要一个能够编译 Java Maven 项目的设置:
- 企业 Maven 存储库(内网 Artifactory 代理 Maven Central 和其他)
- public Maven 存储库(Central、ICM、io.confluent 等)
项目 POM 代码已经引用内部公司存储库:
<repositories>
<repository>
<id>artifactory-virtual</id>
<name>My Artifactory Repository to download</name>
<url>https://artifactory.corporation.com/maven</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
但是要使用此存储库需要 VPN 连接,我想避免。
我正在尝试使用 this Maven documentation.
设置存储库镜像因此我在 ~/.m2/settings.xml
中配置以下配置:
<?xml version="1.0" encoding="UTF-8"?>
<settings>
...
<mirrors>
<mirror>
<id>icm-mirror</id>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
<mirrorOf>*,!central</mirrorOf>
</mirror>
</mirrors>
...
</settings>
但只是单独提供一个镜像(除了 central 之外的所有 repos),该项目仍在尝试从公司存储库下载(我没有提供任何):
[ERROR] Failed to execute goal on project ibis-customer-management:
Could not resolve dependencies for project com.example.project:myproject:jar:3.7.1-SNAPSHOT:
Failed to collect dependencies at com.oracle.jdbc:ojdbc8:jar:18.3.0.0:
Failed to read artifact descriptor for com.oracle.jdbc:ojdbc8:jar:18.3.0.0: Could not transfer artifact com.oracle.jdbc:ojdbc8:pom:18.3.0.0 from/to artifactory-virtual (https://artifactory.corporation.com/maven):
Transfer failed for https://artifactory.corporation.com/maven/com/oracle/jdbc/ojdbc8/18.3.0.0/ojdbc8-18.3.0.0.pom:
Connect to artifactory.corporation.com [artifactory.corporation.com/1.2.3.4] failed:
Operation timed out -> [Help 1]
即使我使用 ICM 存储库的显式条目创建活动配置文件,该错误也未修复:
<settings>
...
<mirrors>
<mirror>
<id>icm-mirror</id>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
<mirrorOf>*,!central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<profile>
<id>not-corpnet</id>
<repositories>
<repository>
<id>icm</id>
<name>ICM Repository</name>
<url>http://maven.icm.edu.pl/artifactory/repo/</url>
</repository>
</repositories>
</profile>
</profiles>
<activeProfiles>
<activeProfile>not-corpnet</activeProfile>
</activeProfiles>
...
</settings>
如果您认为我的 settings.xml
中可能还有其他内容,上面的几乎是完整的(没有点,并且具有正确的 XML 命名空间。
当我 运行 mvn
[INFO] --- maven-help-plugin:3.2.0:active-profiles (default-cli) @ myproject ---
[INFO]
Active Profiles for Project 'com.example.project:myproject:pom:3.7.1-SNAPSHOT':
The following profiles are active:
- not-corpnet (source: external)
当我不在公司 network/VPN 中时,如何使我的项目(其 POM 已包含在公司存储库中)从 public 个存储库下载工件?
通过执行以下操作,我们终于达到了在 public 和企业网络中以相同方式工作的 OK 设置:
项目
pom.xml
包含所需的 public 存储库:<repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo1.maven.org/maven2/</url> </repository> <repository> <id>icm</id> <name>ICM Repository</name> <url>http://maven.icm.edu.pl/artifactory/repo/</url> </repository> <repository> <id>confluent</id> <name>Confluent Repository</name> <url>http://packages.confluent.io/maven/</url> </repository> </repositories>
假设项目不需要非 public 依赖项,这将允许 "checkout and run" 在 public 环境中的工作方式。
如果我们在公司网络内部(可以访问私有存储库)并且在公司代理后面,我们使用每个开发人员都可以使用的
settings.xml
文件(~/.m2/serttings.xml
) 用于企业环境内部的发展。此文件包含<proxies>
和<mirrors>
:<mirrors> <mirror> <id>internal-repository-mirror</id> <name>Maven Mirror</name> <url>https://artifactory.corporation.com/maven</url> <mirrorOf>*,!confluent</mirrorOf> </mirror> <mirror> <id>internal-confluent-mirror</id> <name>Confluent Mirror</name> <url>https://artifactory.corporation.com/confluent-maven</url> <mirrorOf>confluent</mirrorOf> </mirror> </mirrors> <proxies> <proxy> <id>corpnet-http-proxy</id> <active>true</active> <protocol>http</protocol> <host>proxy.corporation.com</host> <port>8079</port> <nonProxyHosts>artifactory.corporation.com</nonProxyHosts> </proxy> <proxy> <id>corpnet-https-proxy</id> <active>true</active> <protocol>https</protocol> <host>proxy.corporation.com</host> <port>8079</port> <nonProxyHosts>artifactory.corporation.com</nonProxyHosts> </proxy> </proxies>
settings.xml
文件中不需要其他存储库或配置文件。
关于如何以自动方式交换 settings.xml
,我使用以下适合我始终打开终端的工作方式的方法:
- 当我启动终端时 window/tab 正在执行
~/.bash_profile
(或等效) - 取决于我所在的网络(public 或 corporate/VPN)我 copy/overwrite 我准备的两个现有
settings.xml
文件之一: **settings-public.xml
几乎是空的(可能有一些我在 playing/experimenting 代码中使用的特殊存储库) **settings-corpnet.xml
至少包含上面指出的<mirrors>
和<proxies>
部分