# 关于更换Maven阿里云镜像的经验总结

> 作者：zning（https://ning.ae） · 发布：2020/05/26 23:41 下午 (UTC+8) · 原文：https://zning.me/15905077159608.html

今天需要编译`flink-1.9.0`和`flink-shaded`，由于网上所给信息是，在编译时需要在两个工程内设置非中央仓库的官方镜像源（`flink-1.9.0`已经自带）。

```xml
<profile>
    <id>vendor-repos</id>
    <activation>
        <property>
            <name>vendor-repos</name>
        </property>
    </activation>
    <!-- Add vendor maven repositories -->
    <repositories>
        <!-- Cloudera -->
        <repository>
            <id>cloudera-releases</id>
            <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <!-- Hortonworks -->
        <repository>
            <id>HDPReleases</id>
            <name>HDP Releases</name>
            <url>https://repo.hortonworks.com/content/repositories/releases/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>HortonworksJettyHadoop</id>
            <name>HDP Jetty</name>
            <url>https://repo.hortonworks.com/content/repositories/jetty-hadoop</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <!-- MapR -->
        <repository>
            <id>mapr-releases</id>
            <url>https://repository.mapr.com/maven/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
</profile>
```

由于Maven本身是连接的apache.org的中央仓库镜像源，因此我在网上找到了阿里镜像源进行更换。其中教程一与二给的更换镜像源XML配置如下：

```xml
<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云公共仓库</name>
        <url>https://maven.aliyun.com/repository/public</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云谷歌仓库</name>
        <url>https://maven.aliyun.com/repository/google</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云阿帕奇仓库</name>
        <url>https://maven.aliyun.com/repository/apache-snapshots</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云spring仓库</name>
        <url>https://maven.aliyun.com/repository/spring</url>
    </mirror>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>*</mirrorOf>
        <name>阿里云spring插件仓库</name>
        <url>https://maven.aliyun.com/repository/spring-plugin</url>
    </mirror>
</mirrors>
```

但是在更改后，我发现编译失败，说是在阿里云仓库找不到需要在我文章开头设置的仓库里找的包。但是我明明在工程的`pom.xml`里设置了四个非中央的官方仓库了呀？

后来又搜了两篇阿里云教程设置，我发现其XML配置为：

```xml
<mirrors>
    <mirror>
        <id>aliyunmaven</id>
        <mirrorOf>central</mirrorOf>
        <name>aliyun maven</name>
        <url>https://maven.aliyun.com/repository/public </url>
    </mirror>
</mirrors>
```

其中，`<mirrorOf>central</mirrorOf>`同之前的仓库设置是不一样的，之前是`*`，现在是`central`。据此，我分析，由于通配符的问题，Maven全局的`Settings.xml`文件，将我工程内`pom.xml`设置的四个非中央官方仓库的设置给一并覆盖了，导致失效，从而无法让工程从应有的位置拉取依赖包，导致编译失败。

经过修改之后，`flink-shaded`工程目前编译已正常通过。确认是这个问题。因此我们可以知道的是：

* 若设置了`<mirrorOf>*</mirrorOf>`这个标签，则可能会导致工程内`pom.xml`相应设置的仓库失效。全局设置覆盖了工程设置。
* 应避免直接设置`<mirrorOf>*</mirrorOf>`这个标签，而是设置指定仓库例如`<mirrorOf>central</mirrorOf>`表示此为中央仓库的代理。
