第三章
maven complier插件默认只支持编译java1.3,需要在pom中指定jdk版本。
是插件支持java5
<project>
···
<build>
<plugins>
<groupId>org.apache.maven.plugins</...>
<artifactId>maven-compiler-plugin</...>
<configuration>
<source>1.5</...>
<target>1.5</...>
</...>
</....>
</...>
...
</project>
第五章
pom的基本元素
加粗为必选
groupId: maven 项目隶属的实际项目
artifactId: maven 实际项目中的一个maven项目(模块)
version: maven 项目的版本
packaging: maven 项目的打包方式(默认jar)
classifier: 定义构建输出的一些附属构件。比如生产jar文件时,可以通过插件实现同时生产doc包和source包
ps.项目构建的文件名的默认规则为【artifactId-version[-classifier].packaging-->[]表示可选】
依赖的配置
<project>
<dependencies>
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>0.0.65</version>
<type>pom</type>
<scope>import</scope>
<optional>xxx</optional>
<exclusions>
<exclusion>
···
</exclusion>
···
</exclusions>
</dependency>
</dependencies>
···
</project>
groupId, artifactId, version: 依赖的基本坐标元素
type: 依赖类型,与packaging对应,默认值为jar
scope:依赖的范围,compile(编译),test(测试),provided(编译和测试),runtime(测试和运行),system(与provided一样,但是需要使用systemPath显示指定依赖文件的路径),import(第八章介绍)
主要正对编译,测试,运行时classpath不一样的情况。
optional:依赖是否可选
exclusions:排除传递性依赖
scope | 编译classpath | 测试classpath | 运行时classpath |
---|---|---|---|
compile | Y | Y | Y |
test | — | Y | — |
provided | Y | Y | — |
runtime | — | Y | Y |
system | Y | Y | — |
依赖性传递
依赖的依赖,比如,项目依赖spring-framework,又需要引入spring-framework的依赖。
通过依赖项目的pom文件实现传递性依赖的解决。
传递性依赖范围规则。
最左边的行表示第一依赖范围,第一行表示第二依赖范围
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | — | — | runtime |
test | test | — | — | test |
provided | provided | — | provided | provided |
runtime | runtime | — | — | runtime |
依赖调解
第一原则:路径最近者优先
第二原则:第一声明者优先(A->B->Y(1.0), A->C->Y(2.0))若在项目A中B的声明在C的前面则依赖于Y(1.0)
可选依赖不会传递
对于两个可选依赖要指定一个的时候需要在项目中显示声明
最佳实践
排除依赖
由于版权因素和SNAPSHOT的不稳定性,需要排除第三方依赖,并在项目指定依赖。
归类依赖
<project>
<properties>
<springframework.version>2.5.6</springframework.version>
</properties>
···
<dependencies>
<dependency>
<version>${springframework.version}</version>
</dependency>
···
</dependencies>
</project>
优化依赖
mvn dependency:list 查看依赖
mvn dependency:analyze 分析依赖
需要注意
- Used undeclared dependencies
使用但是未直接声明,直接依赖传递进来的,在直接依赖升级时会导致该依赖发生变化,引起项目编译错误,不易察觉,建议所有使用到的项目依赖都直接声明,方便版本控制 - Unused declared dependencies
maven只会分析主代码和测试代码的依赖,执行测试和运行时的依赖发现不了,建议谨慎处理
第六章
构件路径的构成:
groupId/artifactId/version/artifactId-version-classifier.