有哪些依赖范围
Scope: 依赖范围(compile,test,provided,runtime,system 五种状态)
org.springframework
spring-core
2.5
compile
junit
junit
4.7
test
javax-servlet
servlet-api
2.0
provided
运行时依赖范围(runtime),使用该依赖范围的maven依赖,只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。
系统依赖范围(system),该依赖与classpath的关系与 provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:
javax.sql
jdbc-stext
2.0
system
${java.home}/lib/rt.jar
maven引入的传递性依赖机制,一方面大大简化和方便了依赖声明,另一方面,大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖。但有时候,当传递性依赖造成问题的时候,我们就需要清楚地知道该传递性依赖是从哪条依赖路径引入的。
maven对于依赖相同的资源,默认会做出以下优化:
第一原则:以短路径长度为准
例如,项目A有这样的依赖关系 : A–>B–>C–>X(1.0)、A–>D–>X(2.0),X是A的传递性依赖,但是两条依赖路径上有两个版 本的X,那么哪个X会被maven解析使用呢?两个版本都被解析显然是不对的,因为那会造成依赖重复,因此必须选择一个。maven依赖调解的第一原则:路径最近者优先。该例中X(1.0)的路径长度为3,而X(2.0)的路径长度为2,因此X(2.0)会被解析使用。
第二原则:相同路径长度时,以pom中声明顺序为准
依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和Y(2.0)的依赖路径长度是一样的,都为2。那么到底谁会被解析使用呢?在maven2.0.8及之前的版本中,这是不确定的,但是maven2.0.9开始,为了尽可能避免构建的不确定性,maven定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。
maven pom中配置 exclusion标签 手动去除依赖
sample.ProjectA
Project-A
1.0
compile
sample.ProjectB
Project-B
maven是个项目管理工具,如果我们不告诉它我们的代码要使用什么样的jdk版本编译的话,它就会用maven-compiler-plugin默认的jdk版本来进行处理,这样就容易出现版本不匹配,以至于可能导致编译不通过的问题。
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“Java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。
可以在POM中,指定生成 的是Jar还是War。
org.springframework.boot
spring-boot-maven-plugin
2.0.3.RELEASE
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
该插件的作用 主要是处理将 主程序与 测试程序所需的源文件复制到输出编译文件夹中。
构建Maven项目的时候,如果没有进行特殊的配置,Maven会按照标准的目录结构查找和处理各种类型文件。
1)src/main/java和src/test/java目录下的所有*.java文件分别在comile和test-comiple阶段被编译,编译结果分别放到了target/classes和targe/test-classes目录中,但是这两个目录中的其他文件都会被忽略掉。
2)src/main/resouces和src/test/resources这两个目录中的文件也会分别被复制到target/classes和target/test-classes目录中。
但是会出现如下情况
1)放在src/main/java下的xml文件,比如mybatis中的mapper.xml,是不会被默认加载的。
2)想要排除默认加载的某些文件,比如我不想加载init.json文件
这个时候就要用到标签和maven-resources-plugin插件了,用法如下:
resource的filtering属性用来表示资源文件中的占位符是否需要被替换,true为需要替换。
false为不需要替换。
src/main/resources
true
src/main/java
**/*.xml
maven打包项目的时候pom.xml配置文件里可以配置对项目进行统一编码,但是部分文件 可能不需要进行重新编码,例如: 证书文件;重新编码后可能导致证书不可用。
org.apache.maven.plugins
maven-resources-plugin
xlsx
xls
zip
cer
pfx
py
keystore