The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

                 任何一個構(gòu)件都有其唯一的坐標(biāo),根據(jù)這個坐標(biāo)可以定義其在倉庫中的唯一存儲路徑,這便是Maven的倉庫布局方式。例如log4j:log4j:1.2.15這一依賴,其對應(yīng)的倉庫路徑為log4j/log4j/1.2.15/log4j-1.2.15.jar,細心的讀者可以觀察到,該路徑與坐標(biāo)的大致對應(yīng)關(guān)系為groupId/artifactId/version/artifactId-version.packaging。下面看一段Maven的源碼并結(jié)合具體的實例來理解Maven倉庫的布局方式:

              private static final char PATH_SEPARATOR = '/';

              private static final char GROUP_SEPARATOR = '.';

              private static final char ARTIFACT_SEPARATOR = '-';

              public String pathOf( Artifact artifact )
              {
                  ArtifactHandler artifactHandler = artifact.getArtifactHandler();

                  StringBuilder path = new StringBuilder( 128 );

                  path.append( formatAsDirectory( artifact.getGroupId() ) ).append( PATH_SEPARATOR );
                  path.append( artifact.getArtifactId() ).append( PATH_SEPARATOR );
                  path.append( artifact.getBaseVersion() ).append( PATH_SEPARATOR );
                  path.append( artifact.getArtifactId() ).append( ARTIFACT_SEPARATOR ).append( artifact.getVersion() );

                  if ( artifact.hasClassifier() )
                  {
                      path.append( ARTIFACT_SEPARATOR ).append( artifact.getClassifier() );
                  }

                  if ( artifactHandler.getExtension() != null && artifactHandler.getExtension().length() > 0 )
                  {
                      path.append( GROUP_SEPARATOR ).append( artifactHandler.getExtension() );
                  }

                  return path.toString();
          }

              private String formatAsDirectory( String directory )
              {
                  return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );
              }
          ??

          該pathOf()方法的目的是根據(jù)構(gòu)件信息生成其在倉庫中的路徑。在閱讀本段代碼之前,讀者可以先回顧一下上一章Maven坐標(biāo)的相關(guān)內(nèi)容。這里,我們根據(jù)一個實際的例子來分析路徑的生成,考慮這樣一個構(gòu)件:groupId=org.testng、artifactId=testng、version=5.8、classifier=jdk15、packaging=jar,其對應(yīng)的路徑按如下步驟生成:

                  首先基于構(gòu)件的groupId準(zhǔn)備路徑,formatAsDirectory()將groupId中的句點分隔符轉(zhuǎn)換成路徑分隔符,該例中,groupId org.testng就會被轉(zhuǎn)換成org/testng,之后再加一個路徑分隔符斜杠,那么org.testng就成為了org/testng/。
          基于構(gòu)件的artifactId準(zhǔn)備路徑,也就是在前面的基礎(chǔ)上加上artifactId以及一個路徑分隔符,該例中的artifactId為testng,那么在這一步過后路徑就成為了org/testng/testng/。
                  接著使用版本信息,在前面的基礎(chǔ)上加上version和路徑分隔符,該例中版本是5.8,那么路徑就成為了org/testng/tesgng/5.8/。
          這一步再依次加上artifactId,構(gòu)件分隔符連字號,以及version,于是構(gòu)建的路徑就變成了org/testng/testng/5.8/testng-5.8。讀者可能會注意到這里使用了artifactId.getVersion(),而上一步用的是artifactId.getBaseVersion(),version和baseVersion的區(qū)別在本章討論SNAPSHOT的時候會具體闡述。
          緊接著如果構(gòu)件有classifier,就加上構(gòu)件分隔符和classifier,該例中構(gòu)件的classifier是jdk15,那么路徑就變成org/testng/testng/5.8/testng-5.8-jdk5。
          最后第檢查構(gòu)件的extension,若extension存在,則加上句點分隔符和extension,從代碼中可以看到,extension是從artifactHandler而非artifact獲取,artifactHandler是由項目的packaging決定的,因此可以說,packaging決定了構(gòu)件的擴展名,該例的packaging是的jar,因此最終的路徑為org/testng/testng/5.8/testng-5.8-jdk5.jar。
                  到這里筆者(包括讀者你)都應(yīng)該感謝Maven開源社區(qū),正是由于Maven的所有源代碼都是開放的,我們才能仔細得深入到其內(nèi)部工作的所有細節(jié)。
                  由于Maven倉庫是基于簡單文件系統(tǒng)存儲的,現(xiàn)在我們又理解了其存儲方式,因此當(dāng)遇到一些與倉庫相關(guān)的問題時,可以很方便的查找相關(guān)文件,方便定位問題。例如當(dāng)Maven無法獲得項目聲明的依賴時,可以簡單該依賴對應(yīng)的文件在倉庫中是否存在,如果不存在,是否有其它版本可用,等等。

           

          posted on 2011-04-21 12:12 Eric_jiang 閱讀(337) 評論(0)  編輯  收藏 所屬分類: Maven
          主站蜘蛛池模板: 邹城市| 建水县| 凉城县| 翼城县| 兴山县| 辽阳市| 富顺县| 依安县| 南召县| 冀州市| 新蔡县| 遵义市| 布拖县| 文昌市| 新余市| 郑州市| 石首市| 仁布县| 郧西县| 祁东县| 衢州市| 鄂尔多斯市| 田东县| 五大连池市| 二连浩特市| 朝阳区| 札达县| 全椒县| 沙河市| 胶南市| 宽甸| 长寿区| 滨海县| 西贡区| 怀远县| 江孜县| 武强县| 海林市| 建德市| 静安区| 建瓯市|