maven实战学习笔记
放假了解了一下maven,发现真是一个不错工具,原来电脑里面的jar包都乱作一团,很多重复,而且经常找jar包找半天,通过使用maven仓库来管理jar包可以很好的解决这个问题。
1:首先安装maven,目前maven有两个大版本,2.X以及3.x,下面是3.0.5的下载地址。
http://mirrors.cnnic.cn/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz
将下载的包解压到指定的目录中,然后像配置jdk环境一样,在系统环境变量中加上变量名为M2_HOME(名字随意取),指向maven解压的跟目录,在path变量中加入%M2_HOME%\bin,此时在cmd控制台中输入mvn -v可以查看mvn的版本信息
2:在控制台中键入mvn help:system命令,可以看到maven会下载一些jar包以及pom.xml文件,这些东西被下载到本地仓库中,默认的本地仓库的路径是个人工作目录下面的.m2文件夹,这个路径可以更改,在M2_HOME/conf目录下面找到settings.xml文件,将该文件拷贝到.m2文件夹下面,修改<localRepository></localRepository>中的路径为本地的仓库路径。有时候在公司的环境中,需要通过代理去上网下载jar包之类的资源,我们可以在setting.xml中配置
<proxies>
<!-- proxy
| Specification for one proxy, to be used in connecting to the network.
|
<proxy> -->
<id>optional</id>
<active>true</active>
<protocol>http</protocol>
<username>proxyuser</username>
<password>proxypass</password>
<host>proxy.host.net</host>
<port>80</port>
<nonProxyHosts>local.net|some.host.com</nonProxyHosts>
</proxy>
</proxies>
一个最简单的pom.xml文件如下所示
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.ynb</groupId>
<artifactId>helloWorld</artifactId>
<version>1.0</version>
<name>helloWorld</name>
</project>
modelVersion为当前POM模型的版本,maven2.0以及maven3.0中只能为4.0.0
groupId,artifactId,version这三行定义了这个项目的基本坐标,在maven中,任何jar包,pom以及项目都是通过坐标来进行定位以及区分的。
groupId定义了项目属于哪个组,artifactId定义了该项目在该组中的id,version定义了该项目的版本信息,maven就是通过这三个属性来找到并下载对应的jar包
4:pom.xml配置
某个项目可能会对其他的jar包以及项目有依赖,我们在pom.xml中配置这种依赖关系。
一个依赖申明可以包含以下元素:
<dependencies>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
<type>jar</type>
<scope>compile</scope>
<optional>true</optional>
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>
对于配置的依赖关系,maven会通过groupId,artifactId,version三个属性首先在本地仓库中查找对应的jar包,如果本地没有,那么会在maven中央仓库中下载,然后存储在本地,以后需要直接从本地仓库中读取而不是道中央仓库去下载。
<type>:该标签通常不用填写,默认为jar
<scope>:该标签表示依赖范围,可选值有:
1.compile编译依赖范围,该值为默认值,对于编译,测试以及运行都需要该依赖关系
2.provided对于编译以及测试class-path有效,但在运行时无效,典型的例子是servlet-api,运行时,容器会提供对应的jar包
3.runtime对于测试以及运行时有效,但是对于编译主代码时无效,典型的例子是jdbc驱动程序,项目编译时只需要jdk提供的jdbc接口,但是在测试以及运行时需要上述接口的具体jdbc实现。
4.system与provided范围一致。但是该范围不通过maven仓库解析,而是与本机系统绑定,需要通过systemPath元素来指定依赖文件的路径,该返回指定的路径与具体的机器有关系,应该少用这种范为
<dependency>
......
<scope>system</scope>
<systemPath>${java_home}/lib/rt.jar</systemPath>//可以引用环境变量
</dependency>
<optional>表示依赖是否为可选依赖
optional标签的值为true或者false。如果为true表示该依赖为可选依赖,对于可选依赖,当项目A包含有依赖项目B,而B包含可选依赖C,那么A并不包含依赖C,如果实际中A项目依赖C,需要显示的申明该依赖。简而言之就是可选依赖是不会被传递的
优化依赖关系
项目之间的依赖关系错综复杂,Maven会自动解析所有项目的直接依赖和传递性依赖,并根据规则正确判断每个依赖的范围,对于一些依赖的冲突也能进行调节,以确保某个构建在依赖关系中只存在一个版本,最后得到的依赖成为已解析依赖,可以通过命令mvn dependency:list查看项目的依赖列表。
mvn dependency:tree以树型形式展示依赖列表以及依赖之间的相互依赖关系。
mvn dependency:analyze对项目中的依赖关系进行分析,会列出Used unclared dependencies以及Unused declared dependencies,
Used unclared dependencies表示使用了没有申明的依赖,我们需要显示申明这种依赖关系
Unused declared dependencies表示有申明了,但是没有使用的依赖,可以移除这种依赖关系