1. 程式人生 > >Maven載入依賴速度慢的原理和解決辦法

Maven載入依賴速度慢的原理和解決辦法

Maven的倉庫、索引

索引:中央倉庫帶有索引檔案以方便使用者對其進行搜尋,完整的索引檔案至2015年12月8日大小約為1.11G,索引每週更新一次。

本地倉庫:是建立在本地機器上的Maven倉庫,本地倉庫是中央倉庫(或者說遠端倉庫)的一個緩衝和子集,當你構建Maven專案的時候,首先會從本地倉庫查詢資源,如果沒有,那麼Maven會從遠端倉庫下載到你本地倉庫。這樣在你下次使用的時候就不需要從遠端下載了。如果你所需要的Jar包版本在本地倉庫沒有,而且也不存在於遠端倉庫,Maven在構建的時候會報錯,這種情況可能發生在有些Jar包的新版本沒有在Maven倉庫中及時更新。Maven預設的本地倉庫地址為${user.home}/.m2/repository

。也就是說,一個使用者會對應的擁有一個本地倉庫。當然你可以通過修改${user.home}/.m2/settings.xml配置這個地址:

1
2
3
4
5
<settings>
  ···
  <localRepository> D:/java/repository</localRepository>
  ...
</settings>

提交內容:只要你的專案是開源的,而且你能提供完備的POM等資訊,你就可以提交專案檔案至中央倉庫,這可以通過Sonatype提供的開源Maven倉庫託管服務實現。

IntelliJ IDEA利用索引實現自動補全

眾所周知,由於偉大的中國防火牆,所以在使用IDEA下載Maven倉庫索引的時候,要麼無法訪問,要麼就是速度極慢,這對開發人員帶來了極大的不便,所以一般公司都用Nexus搭建一個公司內部的私服。同時利用私服更有利於對公司內部開發人員依賴的Jar包版本進行控制。

也許你會問,中央倉庫帶有索引,為什麼本地的IDEA也需要下載索引呢?那麼直接看下圖你就明白了,如果本地沒有下載索引的話,在pom.xml檔案中新增依賴是得不到任何提示的。

IntelliJ IDEA中Maven外掛配置

IntelliJ已經內建了對Maven外掛的支援,當然你也可以配置自己的Maven,只需要進入Settings->Maven->Maven home directory|User settings file|Local repository

配置即可。注意如果使用自己配置的Maven,那麼一定要勾選Override,否則配置不生效。

IntelliJ14.1更新索引失敗原因

在使用14.1.X版本的IntelliJ時,更新Maven索引出現如下錯誤Indexed Maven Repositories - type remore - Error - Idea 14.1.5,根據該連結內所述原因為:這是IntelliJ14.1.X版本中的一個BUG,並且會在下一個釋出版本中進行修復,推薦將IntelliJ升級到版本15。

使用國內Maven倉庫的映象

鑑於偉大的防火牆,所以推薦使用國內的映象資源作為Maven中央倉庫。推薦使用開源中國Maven庫使用幫助,配置很簡單就不詳述了,有兩種方式,其一開啟settings.xml檔案,加入

1
2
3
4
5
6
7
8
<mirrors>
    <mirror>
        <id>nexus-osc</id>
        <mirrorOf>*</mirrorOf><!--用一個簡單的*號會把所有的倉庫地址遮蔽掉-->
        <name>Nexus osc</name>
        <url>http://maven.oschina.net/content/groups/public/</url>
    </mirror>
</mirrors>

當然還有第二種方式,就是遮蔽指定的中央倉庫,並且還可以加入OSChina的第三方映象倉庫或者多個倉庫,配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<mirrors>
    <mirror>
        <id>nexus-osc</id>
        <mirrorOf>central</mirrorOf><!--這裡指定只遮蔽central倉庫-->
        <name>Nexus osc</name>
        <url>http://maven.oschina.net/content/groups/public/</url>
    </mirror>
    <mirror>
        <id>nexus-osc-thirdparty</id>
        <mirrorOf>thirdparty</mirrorOf>
        <name>Nexus osc thirdparty</name>
        <url>http://maven.oschina.net/content/repositories/thirdparty/</url>
    </mirror>
</mirrors>

最後,在執行Maven命令的時候,Maven還需要安裝一些外掛包,這些外掛包的下載地址也讓其指向OSChinaMaven地址。修改如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<profile>
     <id>jdk-1.8</id>
     <activation>
         <jdk>1.8</jdk><!--指定JDK版本是1.8時自動啟用-->
     </activation>
     <repositories>
         <repository>
            <id>nexus</id>
            <name>local private nexus</name>
            <url>http://maven.oschina.net/content/groups/public/</url>
            <releases>
              <enabled>true</enabled>
            </releases>
            <snapshots>
              <enabled>false</enabled>
            </snapshots>
         </repository>
     </repositories>
     <pluginRepositories>
         <pluginRepository>
            <id>nexus</id>
            <name>local private nexus</name>
            <url>http://maven.oschina.net/content/groups/public/</url>
            <releases>
              <enabled>true</enabled>
            </releases>
            <snapshots>
              <enabled>false</enabled>
            </snapshots>
         </pluginRepository>
     </pluginRepositories>
</profile>

另外你也可以下載開源中國提供的官方純淨版settings.xml檔案。

下載Maven倉庫的索引

在配置完成之後就可以下載倉庫索引了,注意這是一個非常耗時的過程,建議利用晚上或者出去午飯時間下載。下載過程及下載完成之後狀態如下圖所示。本次下載整體耗時在一個小時左右。

另外我在思考既然下載一次這麼麻煩,那麼下載下來的索引存放在哪裡呢?我能否將其拷貝到其他機器重複利用呢?於是經過一番搜尋我發現了索引的存放位置,並且將其打包拷貝到其他機器的同樣位置,但未做測試,不知能否重複利用,如有網友測試完畢,可以告訴我,感謝之。

利用本地Tomcat作為索引下載伺服器

  • 啟動一個Apache Tomcat伺服器,在其根目錄下建立一個/maven2/.index的虛擬目錄(注意:如果你使用的是Windows系統,可能無法建立.index件夾,必須使用DOS命令:mkdir .index),把上述兩個檔案拷貝至該虛擬目錄下
  • 編輯C:/WINDOWS/system32/drivers/etc/hosts檔案,在檔案中加入:
    127.0.0.1 repo1.maven.org
    注意:127.0.0.1為步驟2的Apache Tomcat伺服器IP地址。
  • 在IDEA的maven外掛中更新索引
  • 移除步驟3中在hosts檔案中新增的內容

備註:其實該解決辦法的總體思路就是先將索引檔案整體下載,然後利用本地的Tomcat作為伺服器,再從Tomcat上更新索引。

開源中國映象存在的問題

  • 開源中國映象不是很穩定,有時候很快下載完成有時候一直處於Resolving dependencies of ...狀態而無法下載
  • 在配置了開源中國第三方庫映象之後,發現一個問題,該庫內容更新不及時,很多第三方庫中的Jar包版本都非常陳舊。
  • 開源中國的中央倉庫與第三方庫中存在很多交叉的情況,也就是說中央倉庫包括了第三方庫中的內容,而且在下載jar檔案的時候,預設就是直接從開源中國的中央倉庫映象下載,而不是開源中國的第三方倉庫映象下載。
  • 我給出的建議是,如無必要,移除開源中國的第三方庫映象地址,移除的內容如下

    1
    2
    3
    4
    5
    6
    
    <mirror>
          <id>nexus-osc-thirdparty</id>
          <mirrorOf>thirdparty</mirrorOf>
          <name>Nexus osc thirdparty</name>
          <url>http://maven.oschina.net/content/repositories/thirdparty/</url>
    </mirror>
    
  • 針對以上問題,有時候還是需要從國外Maven官方的倉庫下載,方法是隻需要修改settings.xml檔案為官方預設版本即可。現將Maven預設settings.xml貼出

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    <?xml version="1.0" encoding="UTF-8"?>
    <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">
      <localRepository>D:/apache-maven-3.3.1/repository</localRepository>
      </pluginGroups>
      <proxies>
      </proxies>
      <servers>
      </servers>
      <mirrors>
      </mirrors>
      <profiles>
      </profiles>
    </settings>