maven依赖
1. 依赖的范围
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
groupId、artifactId和version合称gav,它们三个确定一个唯一的jar
scope表示jar包使用的范围,scope有三个参数,分别是:compile、test、provided
maven在编译、测试和部署(运行)时,各自使用一套classpath
compile | test | provided | |
---|---|---|---|
编译 | √ | × | √ |
测试 | √ | √ | √ |
部署(运行) | √ | × | × |
2. 依赖排除
当用gav的方式引入spring-context.jar
时,maven会自动引入其他jar包,比如spring-aop.jar
、spring-beans.jar
等。像这种依赖关系还有很多。
我们可以使用排除依赖的方式,排除不需要的jar包
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
3. 依赖的传递性
如果A.jar依赖于B.jar,B.jar依赖于C.jar。如果B.jar与C.jar的依赖范围是compile,则A.jar也依赖于C.jar。
- 依赖原则-路径长度不同:最短优先原则
如果A模块依赖于B模块,B模块依赖于junit.jar且其之间的范围为compile。
如果A模块自身也依赖于junit.jar,与B模块引用的版本不一样。
如果A模块引用B模块之后,A模块依然使用的是自身引用的junit.jar - 依赖原则-如果路径长度相同
- 同一个pom.xml里引用了两个版本不同的Jar,后面的覆盖前面的(尽量不要在pom.xml文件里引入多个相同的jar)
- 如果一个A模块分别引用了B模块和C模块,B模块和C模块又都引用了版本不同的同名jar包,则A先引用的模块的jar包覆盖后引用的。
4. 模块之间的依赖
如果A模块依赖于B模块,则将B模块install到本地仓库,A模块引用就可以了,如下例。
<dependency>
<groupId>org.santiago.maven</groupId>
<artifactId>HelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
5. maven声明周期
Maven共有三套生命周期
clean
:清理项目default
:构建项目site
:建立和发布项目站点
分别归纳一下每套生命周期中所用的命令
-
clean生命周期
pre-clean
(执行一些清理前需要完成的工作)clean
(清理上一次构建生成的文件,最常用)post-clean
(执行一些清理后需要完成的工作)
-
default生命周期
default生命周期定义了真正构建时所需要的执行的所有步骤,它是生命周期中最核心的部分,包含内容很多,这里只列举几个常用的。process-sources
(处理项目主资源文件,将src/main/resources目录的内容经过处理后,复制到项目输出的主classpath目录中)compile
(编译项目主源码,编译src/main/java目录下的java文件至项目输出的主classpath目录中)process-test-source
(处理项目测试资源文件。对src/test/resources目录)test-compile
(编译项目的测试代码)test
(使用单元测试框架运行测试,测试代码不会被打包或部署)package
(接受编译好的代码,打包成可发布格式)install
(发布到本地仓库)deploy
(发布到远程仓库)
-
site生命周期
site生命周期建立和发布项目站点。Maven能够基于POM所包含信息,自动生成一个友好的站点,方便团队交流和发布项目信息。
一共包含四阶段,这里离列举两个常用的site
(生成项目站点文档)site-deploy
(将生成的项目站点发布到服务器上)
命令行与生命周期
mvn clean
:调用clean生命周期的clean阶段。实际执行为pro-clean和clean阶段mvn compile
:实际执行default 从头到compile阶段mvn clean install
:调用clean生命周期的clean阶段和default生命周期的install阶段,实际调用了pro-clean ,clean ,以及default生命周期的从validate到install所有阶段。其余命令使用诸如此类。mvn tomcat:run
(一键启动)mvn test
编译并运行了test中内容mvn package
:打包mvn install
:发布项目到本地仓库mvn deploy
:发布项目到远程仓库
其余常用命令
- 查看项目中真正的依赖
mvn dependency:list
- 让项目中依赖有效的jar包成层次性显式
mvn dependency:tree
- 分析当前项目依赖jar中潜在的危险
mvn dependency:analyze
- 分析结果中:
Used undeclared dependencies
意思为在项目中使用,但是没有显式声明的依赖。Unused declared dependencies
。意思为项目未使用,但是显式声明的依赖。对于这样的依赖不应该简单删除声明,而是仔细分析。因为dependency:analyze
只分析编译主代码和测试代码需要用到的依赖。 - 在编译的时候跳过测试类
mvn compile -Dmaven.test.skip =true