《Maven 实战》读书笔记(四) 仓库
0.1. 仓库的概念
大家可能注意到了,在基于Maven管理的项目开发中,这个项目自身是不引进第三方jar包的,使用的时候通过pom.xml的依赖机制,从本地仓库或者远程仓库去获取第三方jar包。这个其实是打破了以往的开发习惯,一般我们是在开发项目的时候需要哪个jar包了,立刻google一下,找到相关网址,之后下载,放到我们项目的classpath中。现在是不必强制引用jar,只要通过pom.xml配置,到一定的时刻,比如编译、测试、打包、部署,自然会将依赖的jar放进您预先的位置。Maven仓库是基于简单文件系统存储的,根据咱们之前提到的坐标,可以找到该组件在仓库的位置。
0.2. 仓库的分类
一般说Maven的仓库就是指2个类型,一个就是我们自己的PC机器本地仓库,另一个就是指远程的Maven中心仓库(天啊,如果某天Maven组织宣布不对中国开放中心仓库那是怎样的局面啊?我的妈呀,太刺激啦~)。当本地仓库没有您需要的jar包的时候,它会从远程核心中心仓库中下载,所以说美国人想制约咱们中国的软件发展是很容易的,现在搞得连仓库都云计算、云存储了,真要是中美打起仗来……。不过我们有私服,私服就是另一种特殊的远程仓库,为了节省Maven核心仓库的带宽和时间,很多企业都在公司的局域网内搭建了私有的仓库服务器,内部项目先从私服下载东东,没有的时候私服从外网中心仓库下载,内部开发的项目还能上传到私服上供其他项目组使用。
0.3. 本地仓库明细
本地仓库大家已经不陌生了,默认是在用户临时文件夹的~/.m2/repository下。
settings.xml中
1. Maven仓库依赖解析机制
当本地仓库没有依赖组件的时候,Maven会从远程的中心仓库或者私服下载依赖包,当依赖的版本是快照版本的时候,则自动先找到快照的最新版本。
1.1:当依赖范围是system的时候,Maven直接从本地库解析
1.2:根据咱们之前提到的Maven坐标解析路径后,开始查找工作,如果根据坐标发现了该组件,那么认为此次解析依赖成功
2.1:当本地仓库不存在相应组件的情况下,如果在pom.xml写着以来的版本是显示的发布版本,例如
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.1</version> </dependency>
<repositories> <repository> <id>jboss</id> <url>http://repository.jboss.com/maven2/</url> <releases> <enabled>true</enabled> </releases> <snapshots> <enabled>false</enabled> </snapshots> <layout>default</layout> </repository> </repositories>
<?xml version="1.0" encoding="UTF-8"?><metadata> <groupId>org.icefaces</groupId> <artifactId>icefaces-comps</artifactId> <version>1.6.1</version> <versioning> <versions> <version>1.6.1</version> <version>1.6.2</version> <version>1.7.0</version> <version>1.7.1</version> <version>1.7.2</version> <version>1.8.0</version> </versions> <lastUpdated>20110602022501</lastUpdated> </versioning> </metadata>
<?xml version="1.0" encoding="UTF-8"?><metadata> <groupId>org.eclipse.persistence</groupId> <artifactId>eclipselink</artifactId> <version>1.0.2</version> <versioning> <versions> <version>1.0.2</version> </versions> <lastUpdated>20110602022437</lastUpdated> </versioning> </metadata>
<pluginRepositories> <pluginRepository> <id>central</id> <name>Maven plugin</name> <url>htpp://repo1.maven.org/maven2</url> <layout>default</layout> <snapshots> <enabled>true</enabled> </snapshots> <releases> <enabled>false</enabled> </releases> </pluginRepository> </pluginRepositories>
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.liuyan.maven.helloword.HelloWorld</mainClass> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>