Maven仓库的布局

URL: http://juvenshun.javaeye.com/blog/547787
任何一个构件都有其惟一的坐标,根据这个坐标能够定义其在仓库中的惟一存储路径,这即是Maven的仓库布局方式。例如log4j:log4j:1.2.15这一依赖,其对应的仓库路径为log4j/log4j/1.2.15/log4j-1.2.15.jar,细心的读者能够观察到,该路径与坐标的大体对应关系为groupId/artifactId/version/artifactId-version.packaging。下面看一段Maven的源码并结合具体的实例来理解Maven仓库的布局方式:
Java代码 
  1.     private static final char PATH_SEPARATOR = '/';  
  2.   
  3.     private static final char GROUP_SEPARATOR = '.';  
  4.   
  5.     private static final char ARTIFACT_SEPARATOR = '-';  
  6.   
  7.     public String pathOf( Artifact artifact )  
  8.     {  
  9.         ArtifactHandler artifactHandler = artifact.getArtifactHandler();  
  10.   
  11.         StringBuilder path = new StringBuilder( 128 );  
  12.   
  13.         path.append( formatAsDirectory( artifact.getGroupId() ) ).append( PATH_SEPARATOR );  
  14.         path.append( artifact.getArtifactId() ).append( PATH_SEPARATOR );  
  15.         path.append( artifact.getBaseVersion() ).append( PATH_SEPARATOR );  
  16.         path.append( artifact.getArtifactId() ).append( ARTIFACT_SEPARATOR ).append( artifact.getVersion() );  
  17.   
  18.         if ( artifact.hasClassifier() )  
  19.         {  
  20.             path.append( ARTIFACT_SEPARATOR ).append( artifact.getClassifier() );  
  21.         }  
  22.   
  23.         if ( artifactHandler.getExtension() != null && artifactHandler.getExtension().length() > 0 )  
  24.         {  
  25.             path.append( GROUP_SEPARATOR ).append( artifactHandler.getExtension() );  
  26.         }  
  27.   
  28.         return path.toString();  
  29. }  
  30.   
  31.     private String formatAsDirectory( String directory )  
  32.     {  
  33.         return directory.replace( GROUP_SEPARATOR, PATH_SEPARATOR );  
  34.     }  
 
该pathOf()方法的目的是根据构件信息生成其在仓库中的路径。在阅读本段代码以前,读者能够先回顾一下上一章Maven坐标的相关内容。这里,咱们根据一个实际的例子来分析路径的生成,考虑这样一个构件:groupId=org.testng、artifactId=testng、version=5.八、classifier=jdk1五、packaging=jar,其对应的路径按以下步骤生成:
  1. 首先基于构件的groupId准备路径,formatAsDirectory()将groupId中的句点分隔符转换成路径分隔符,该例中,groupId org.testng就会被转换成org/testng,以后再加一个路径分隔符斜杠,那么org.testng就成为了org/testng/。
  2. 基于构件的artifactId准备路径,也就是在前面的基础上加上artifactId以及一个路径分隔符,该例中的artifactId为testng,那么在这一步事后路径就成为了org/testng/testng/。
  3. 接着使用版本信息,在前面的基础上加上version和路径分隔符,该例中版本是5.8,那么路径就成为了org/testng/tesgng/5.8/。
  4. 这一步再依次加上artifactId,构件分隔符连字号,以及version,因而构建的路径就变成了org/testng/testng/5.8/testng-5.8。读者可能会注意到这里使用了artifactId.getVersion(),而上一步用的是artifactId.getBaseVersion(),version和baseVersion的区别在本章讨论SNAPSHOT的时候会具体阐述。
  5. 紧接着若是构件有classifier,就加上构件分隔符和classifier,该例中构件的classifier是jdk15,那么路径就变成org/testng/testng/5.8/testng-5.8-jdk5。
  6. 最后第检查构件的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没法得到项目声明的依赖时,能够简单该依赖对应的文件在仓库中是否存在,若是不存在,是否有其它版本可用,等等。
相关文章
相关标签/搜索