1

我需要一个设置才能使用以下任一方式编译 Java Maven 项目:

  • 企业 Maven 存储库(内网 Artifactory 代理 Maven Central 等)
  • 公共 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 连接。

我正在尝试使用此 Maven 文档设置存储库镜像。

因此,我~/.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>

但仅提供一个镜像(对于除中央以外的所有存储库),该项目仍在尝试从公司存储库下载(我没有提供任何):

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

如果您认为 my 中可能还有其他内容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)

当我不在公司网络/VPN 中时,如何使我的项目(已经在其 POM 中的公司存储库中)从公共存储库中下载工件?

4

1 回答 1

3

通过执行以下操作,我们最终达到了一个可以在公共网络和企业网络中以相同方式工作的设置:

  • 该项目pom.xml包含所需的公共存储库:

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

    假设项目不需要非公共依赖项,这将允许在公共环境中以“签出并运行”的方式工作。

  • 如果我们在公司网络内部(可以访问私有存储库)并且在公司代理之后,我们使用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以自动方式交换,我使用以下适合我的工作方式的方法,我总是打开终端:

  • 当我启动终端窗口/选项卡时~/.bash_profile(或等效)正在执行
  • 根据我所在的网络(公共或公司/VPN)我复制/覆盖settings.xml我准备的两个现有文件之一:**settings-public.xml几乎是空的(可能有一些我在玩/试验代码时使用的特殊存储库)**settings-corpnet.xml至少包含上面指出的<mirrors><proxies>部分
于 2020-04-15T15:31:55.160 回答