前言:
今天在編譯Flink的時候,一直失敗,但是看網上的文章好像編譯挺簡單的,後來發現,其實是公司的網/國內的網不太行再加上我選擇的maven遠程倉庫上缺了一些package。
之前我使用的遠程倉庫是mvnrepository.com,國內訪問的速度還行,但是package不全。比較全的應該是中央倉庫,它的repository id 是central,這個是maven默認的,我們不必配置。但是國內訪問速度特別特別特別慢,基本下不動。因此最好能夠有個proxy。但是全走proxy也不太好,畢竟還是沒有直接走國內的那麼快。最理想的情況就是,大部分的包我都能通過阿里雲的maven倉下載,當阿里雲沒有這個包的時候,再走mvnrepository.com,還沒有的話再走中央倉。
如何設置呢?
首先我們要知道,maven幫我們尋找jar包時選擇的倉庫的順序。
maven搜索依賴的優先級:
本地倉庫 > settings文件中profile定義的倉庫 > 項目pom文件中profile標籤中定義的倉庫 > pom文件中repositories標籤定義的倉庫 > settings文件中定義的mirror鏡像 > 默認的central
mirror和repository是什麼關係?
mirror其實就是一個代替它所指定的repository的倉庫,mirror通過指定mirrorOf標籤的值(這個值就是repository的id,如果是*則表示所有repository)來代替一個存在的repository。假設有一個mirror,它的mirrorOf標籤的值是central,它表示,任何要到central的下載都不行了,要走mirror制定的url去下載,即使沒有mirror中沒有這個package,maven也不會再去central下載了,會導致jar包下載失敗。由於大部分的鏡像地址(包括maven.aliyun.com)中的package都不怎麼全,這就造成mirror這個配置有點雞肋了。
配置:
1. 我刪除了所有的mirror配置,並且在settings文件的profiles標籤中定義了兩個profile,一個是aliyun的倉庫,一個是mvnrepository.com的倉庫,aliyun放在第一位,因爲我想讓下載首先通過國內,mvnrepository放在第二個。結構如下:
<profiles>
<profile>
<id>aliyun_profile</id>
<repositories>
<repository>
<id>aliyun</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
<profile>
<id>mvnrepository_profile</id>
<repositories>
<repository>
<id>mvnrepository</id>
<url>https://mvnrepository.com/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</profile>
</profiles>
<!--激活profile-->
<activeProfiles>
<activeProfile>aliyun_profile</activeProfile>
<activeProfile>mvnrepository_profile</activeProfile>
</activeProfiles>
2. 因爲以上兩個倉庫還是不太全,所以還是需要最後走中央倉庫,因此,我在settings文件的proxies標籤中定義一個proxy,proxy要屏蔽掉阿里雲。
<proxies>
<proxy>
<id>socks5</id>
<active>true</active>
<protocol>socks5</protocol>
<host>127.0.0.1</host>
<port>1080</port>
<!--阿里雲的下載不要通過proxy-->
<nonProxyHosts>*.aliyun.com*|172.*|10.*</nonProxyHosts>
</proxy>
</proxies>
如果proxy不生效,請檢查你的maven home目錄下的conf文件夾中settings文件是不是你的ide默認的配置settings文件。
在idea中使用的時候好像還是不生效,那就換個方法,在mvn clean install之前,先運行一下
export MAVEN_OPTS="-DproxySet=true -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080 -DnonProxyHosts=*aliyun.com*|172.*|10.*"
不想proxy的時候,就
export MAVEN_OPTS="-DproxySet=false"