<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The NoteBook of EricKong

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

           任何一個構件都有其唯一的坐標,根據這個坐標可以定義其在倉庫中的唯一存儲路徑,這便是Maven的倉庫布局方式。例如log4j:log4j:1.2.15這一依賴,其對應的倉庫路徑為log4j/log4j/1.2.15/log4j-1.2.15.jar,細心的讀者可以觀察到,該路徑與坐標的大致對應關系為groupId/artifactId/version/artifactId-version.packaging。下面看一段Maven的源碼并結合具體的實例來理解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()方法的目的是根據構件信息生成其在倉庫中的路徑。在閱讀本段代碼之前,讀者可以先回顧一下上一章Maven坐標的相關內容。這里,我們根據一個實際的例子來分析路徑的生成,考慮這樣一個構件:groupId=org.testng、artifactId=testng、version=5.8、classifier=jdk15、packaging=jar,其對應的路徑按如下步驟生成:

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

     

    posted on 2011-04-21 12:12 Eric_jiang 閱讀(337) 評論(0)  編輯  收藏 所屬分類: Maven
    主站蜘蛛池模板: 无码天堂va亚洲va在线va| 亚洲另类自拍丝袜第1页| 无人视频免费观看免费视频| 成年大片免费视频| 波多野结衣亚洲一级| A在线观看免费网站大全| 亚洲AV无码一区二区三区人| 777爽死你无码免费看一二区 | 丁香婷婷亚洲六月综合色| 香蕉成人免费看片视频app下载| 亚洲人成伊人成综合网久久久| 亚洲一区二区三区精品视频| 亚洲视频免费播放| 亚洲女人初试黑人巨高清| 亚洲成年人免费网站| 亚洲成av人片不卡无码| 免费a级毛片高清视频不卡| 亚洲中文字幕无码中文| 国产伦一区二区三区免费| 一区二区三区在线免费观看视频 | 亚洲男人第一无码aⅴ网站| v片免费在线观看| 亚洲AV无码久久精品蜜桃| 最近中文字幕高清免费中文字幕mv | 亚洲免费日韩无码系列| 精品国产麻豆免费人成网站| 亚洲一卡2卡三卡4卡有限公司| 亚洲成人免费网址| 欧美亚洲国产SUV| 大地资源二在线观看免费高清| 亚洲成a人片在线观看天堂无码 | 亚洲精品无码99在线观看| 嫩草成人永久免费观看| 国产精品亚洲产品一区二区三区 | 99久久人妻精品免费一区| 亚洲一级片在线观看| 免费一级毛片不卡在线播放| 久久久久久免费一区二区三区| 亚洲avav天堂av在线网爱情| www.亚洲色图.com| 一级女性全黄久久生活片免费|