注:本文节选自我正在编写的《Maven实战》
任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径,这便是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无法获得项目声明的依赖时,可以简单该依赖对应的文件在仓库中是否存在,如果不存在,是否有其它版本可用,等等。
分享到:
相关推荐
1 . 仓库简介 没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝的文件副本就... 仓库的布局 构件都有唯一的坐标,Maven 根据坐标管理构件的存储。如以下对 spring-orm-3.2.0 的存储
第6章:仓库/6.1 何为Maven仓库 第6章:仓库/6.2 仓库的布局 第6章:仓库/6.3 仓库的分类 第6章:仓库/6.3 仓库的分类/6.3.1 本地仓库 第6章:仓库/6.3 仓库的分类/6.3.1 本地仓库/6.3.1.1 setting.xml文件路径 第6...
Maven仓库(Repositories) 3.5.5. Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2...
该小程序界面设计简洁明了,布局合理,易于上手。同时,其特色功能如实时更新的信息推送、个性化推荐以及社交分享功能,让用户能够及时获取所需信息,并方便地将优质内容分享至朋友圈或好友,实现信息的高效传播与...
Here is English Doc ...在root's build.gradle中加入Jitpack仓库: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 添加依赖到你的app's build.gradle中 dependencies { ...
//如集成失败或不愿意等待,请加上我的maven仓库地址 maven { url "https://dl.bintray.com/wkp/maven" } Note:可能存在Jcenter还在审核阶段,这时会集成失败! 使用详解 > 属性讲解 <!--可变高度的极限小高度-...
RevealLayout揭示效果布局,可以指定2个子布局,以圆形揭示效果切换选中状态截图集成方式添加依赖在项目根目录的build.gradle添加仓库地址allprojects {repositories {...maven { url 'https://www.jitpack.io' }}}...
// JitPack 远程仓库:https://jitpack.io maven { url 'https://jitpack.io' } } } 在项目 app 模块下的 build.gradle 文件中加入 dependencies { // 标题栏框架:https://github.com/getActivity/TitleBar ...
添加JitPack仓库 在当前项目等根目录下的 build.gradle 文件中添加如下内容: allprojects { repositories { ... maven { url "https://jitpack.io" } } } Step 2. 添加项目依赖 dependencies { compile '...
抽取BaseRecyclerViewAdapter,简化代码,支持添加头尾布局。 如何添加 1:Gradle添加: 1.在Project的build.gradle中添加仓库地址 allprojects { repositories { ... maven { url "https://jitpack.io" } } }...
在工程目录的build.gradle中添加JitPack.io的代码仓库地址 allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 项目目录中的build.gradle中添加依赖 ependencies { compile '...
tablayout-android 修改 support 包 TabLayout,实现新浪...2. 布局 只需要把你原来使用的 TabLayout 替换为 com.antiless.support.widget.TabLayout,即可启用蚯蚓动画效果。然后加上一些自定义 indicator 属性,来
凭借完善的架构,它为各种布局格式(例如 , , 和提供了本机实现。 所有已实现的布局格式(也称为“”)均以Java本机编写。 我们的目标是实现一个通用的存储库管理器,它可以托管和服务每种主流格式的工件。 ...
仓库布局 Thesis包含LaTeX代码以产生书面论文。 可以使用build.sh脚本来构建文档,以编译论文并输出thesis.pdf 。 Code包含用于重现本文中实验的源代码。 要求 Python 3.x Maven的3.x Java 1.8或更高版本 .NET ...
- Maven作为项目依赖仓库管理工具,以及对后端项目的打包 - MybatisPlus对Mysql数据库进行基本操作 - SpringCache,SpringDataRedis,以及Redis实现数据库缓存的功能 - SpringSecurity,JWT保证安全以及权限和token...
要在项目中添加约束布局的完整性,请执行以下操作: 确保在顶层build.gradle文件中声明了maven.google.com存储库: repositories { google()}将库作为依赖项添加到模块级build.gradle文件中,如以下示例所示。...
请使用以下链接要使用该库:在build.gradle(Project)中,所有项目{仓库{... maven {url“ https://jitpack.io”}}}然后在另一个gradle文件中(可以是您的应用gradle或您自己的gradle模块库gradle,但是从不添加...
在项目级别build.gradle:allprojects {仓库{..切屑输入布局用于显示切屑的高度可定制的Android ViewGroup(在《材料设计指南》中指定)! 如何使用它...在您的项目级别build.gradle:allprojects {存储库{... maven...
ExRecyclerView在ExRecyclerView中可以设置头、底、item点击监听等操作可利用OnRecyclerViewScrollListener监听滑动到顶部、底部的事件,还可以监听滑动的距离...添加JitPack仓库repositories {maven {url "htt
键盘高度提供器在android中获取键盘高度,这是一个痛苦的过程。...设置将以下仓库添加到您的项目中 repositories { maven { url " https://dl.bintray.com/crysis21/Android " } } 将以下依赖项添加到您的