不常用的命令
- mvn help
1 | # 显示配置信息 |
- mvn dependency
1 | # 显示依赖 |
配置文件区别
$M2_HOME/conf/settings.xml是全局配置~/.m2/settings.xml是用户配置
远程仓库配置
1 | <project> |
远程仓库认证
1 | <settings> |
settings.xml中server元素的id必须与POM中需要认证的repository元素的id完全一致,正是这个id将认证信息与仓库配置联系在了一起
部署至远程仓库
1 | <project> |
distributionManagement:
repository和snapshotRepository子元素,前者表示发布版本构件的仓库,后者表示快照版本的仓库。关于发布版本和快照版本
maven镜像
1 | <settings> |
- <mirrorOf>的值为central,表示该配置为中央仓库的镜像,任何对于中央仓库的请求都会转至该镜像
- <mirrorOf>*</mirrorOf>:匹配所有远程仓库。
- <mirrorOf>external:*</mirrorOf>:匹配所有远程仓库,使用localhost的除外,使用file://协议的除外。也就是说,匹配所有不在本机上的远程仓库。
- <mirrorOf>repo1,repo2</mirrorOf>:匹配仓库repo1和repo2,使用逗号分隔多个远程仓库。
- <mirrorOf>*,!repo1</mirrorOf>:匹配所有远程仓库,repo1除外,使用感叹号将仓库从匹配中排除
依赖范围
compile: 默认,对于编译,运行,测试三种classpath都有效
例如:spring-core,在程序编译,运行,测试都有效果test: 编译测试代码和运行测试代码才需要
例如: junitprovided: 以提供依赖,对于编译,测试有效,运行无效
例如: sevelet-apiruntime: 运行时依赖,运行测试有效,编译无效
例如: jdbc驱动程序runtime不会造成依赖继承,Setting dependency to runtime ensure that there isn’t an accidental dependency on the code, and also keeps the dependency from being transitive. So that, for example, if module A has a runtime dependency on library X, and module B depends on module A, it does not inherit the dependency on library X. Using “provided” or “compile” would cause B to depend on X.
system: 与
provided一致,但需使用systemPath指定引用包路径import: 导入依赖范围
传递性依赖和依赖范围
假设A依赖于B,B依赖于C,我们说A对于B是第一直接依赖,B对于C是第二直接依赖,A对于C是传递性依赖
- 当第二直接依赖的范围是compile的时候,传递性依赖的范围与第一直接依赖的范围一致;
- 当第二直接依赖的范围是test的时候,依赖不会得以传递;
- 当第二直接依赖的范围是provided的时候,只传递第一直接依赖范围也为provided的依赖,且传递性依赖的范围同样为provided;
- 当第二直接依赖的范围是runtime的时候,传递性依赖的范围与第一直接依赖的范围一致,但compile例外,此时传递性依赖的范围为runtime
依赖调解
当一个项目同时经过不同的路径依赖于同一个组件时,会选择其深度最短的对应组件进行依赖。当深度一样的时候Maven会根据申明的依赖顺序来进行选择,先申明的会被作为依赖包
可选依赖
参考
1.《Maven实战》