Maven
Maven概念
一款自动化构建工具,专注服务于Java平台的项目构建和jar包依赖管理。maven并不是一个框架,但是他其中一个功能是帮助开发者管理框架所需要的jar包使用Maven后每个jar包本身只在本地仓库中保存一份,需要jar包的工程只需要以坐标的方式简单的引用一下就可以了。不仅极大的节约了存储空间,让项目更轻巧,更避免了重复文件太多而造成的混乱。
jar包之间的依赖关系
jar包往往不是孤立存在的,很多jar包都需要在其他jar包的支持下才能够正常工作,我们称之为jar包之间的依赖关系。最典型的例子是:commons-fileupload-1.3.jar依赖于commons-io-2.0.1.jar,如果没有IO包,FileUpload包就不能正常工作。而引入Maven后,Maven就可以替我们自动的将当前jar包所依赖的其他所有jar包全部导入进来,无需人工参与,节约了我们大量的时间和精力。
Maven的安装
①检查JAVA_HOME环境变量
C:\Windows\System32>echo %JAVA_HOME%
D:\DevInstall\jdk1.7.0_07
②解压Maven的核心程序
将apache-maven-3.2.2-bin.zip解压到一个非中文无空格的目录下。例如:D:\DevInstall\apache-maven-3.2.2
③配置环境变量
M2_HOME : D:\DevInstall\apache-maven-3.2.2
path : .....;D:\DevInstall\apache-maven-3.2.2\bin
④查看Maven版本信息验证安装是否正确
命令行中输入命令:mvn -v
Maven
Project Object Model:项目对象模型。将Java工程的相关信息封装为对象作为便于操作和管理的模型。Maven工程的核心配置。可以说学习Maven就是学习pom.xml文件中的配置.pom.xml文件存在于项目的根节点下。
依赖
依赖范围
依赖的范围有几个可选值,我们用得到的是:compile、test、provided三个。
compile:编译依赖范围(默认),使用此依赖范围对于编译、测试、运行三种 classpath 都有效,即在编译、测试和运行的时候都要使用该依赖jar包;
test:测试依赖范围,从字面意思就可以知道此依赖范围只能用于测试classpath,而在编译和运行项目时无法使用此类依赖,典型的是JUnit,它只用于编译测试代码和运行测试代码的时候才需要;
provided:此依赖范围,对于编译和测试classpath有效,而对运行(指的并不java项目运行,而是java web项目运行在服务器的时候)时无效;(tomcat的lib文件中的jar包就是web项目的运行环境)
compile | test | provided | |
---|---|---|---|
主程序 | √ | × | √ |
测试程序 | √ | √ | √ |
参与部署,运行阶段 | √ | × | × |
依赖的传递性
A依赖B,B依赖C,A能否使用C呢?那要看B依赖C的范围是不是compile,如果是则可用,否则不可用。
Maven工程 | C依赖范围 | 对A的可见性 |
---|---|---|
A > B > C | compile | √ |
A > B > C | test | × |
A > B > C | provided | × |
依赖的排除
如果我们在当前工程中引入了一个依赖是A,而A又依赖了B,那么Maven会自动将A依赖的B引入当前工程,但是个别情况下B有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入A的时候将B排除。在dependency中添加以下节点
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId><!-- B的坐标-->
</exclusion>
</exclusions>
统一管理所依赖jar包的版本
我们可以将jar包的版本信息统一提取出来,以便对于那些版本号相同的坐标统一修改。
实现步骤:在pom.xml中
1统一声明版本号
<properties>
<my.version>4.1.1.RELEASE</my.version>//自定义标签名
</properties>
2引用前面声明的版本号
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${my.version}</version>
</dependency>
依赖的原则
1.最短路径优先
2.路径相同时先声明者优先