Maven
1.maven其实是一个项目管理工具。有两大核心功能:依赖管理和一键构建。
- 依赖管理:maven对项目中jar包的管理过程。以前我们直接把jar包放置在项目中;而maven工程是将真正的jar包放置在仓库中,项目中只用放置jar包的坐标。
- 一键构建:maven自身集成了Tomcat插件,可以对项目进行编译、测试、打包、安装、发布等操作。
2.仓库种类:本地仓库、远程仓库、中央仓库。
仓库之间的关系:
当我们启动一个maven工程的时候,maven工程会通过pom文件中jar包的坐标去本地仓库找对应的jar包。
默认情况下,如果本地仓库没有对应jar包,maven工程会自动去中央仓库下载jar包到本地仓库。
在公司中,如果本地没有对应jar包,会先从私服下载jar包;如果私服没有jar包,可以从中央仓库下载,也可以从本地上传。
3.maven常用命令:clean
、compile
、test
、package
、install
、deploy
。
maven三套生命周期:清理生命周期、默认生命周期、站点生命周期。
4.maven工程要导入jar包的坐标,就必须要考虑解决jar包的冲突。
maven导入jar包中的一些概念:
- 直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包。
- 传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中去。
解决jar包的冲突
-
方式一:
第一声明优先原则:哪个jar包的坐标在靠上的位置,这个jar包就是先声明的。先声明的jar包坐标下的依赖包,可以优先进入项目中。 -
方式二:
路径近者优先原则:直接依赖路径比传递依赖路径近,那么最终项目中的jar包是路径近的直接依赖包。 -
方式三:
直接排除法:当我们要排除某个jar包下的依赖包,在配置exclusions标签的时候,内部可以不写版本号。因为此时依赖包使用的版本默认和本jar包一样。
5.关于锁定jar包版本
为什么需要锁定jar包版本?
maven工程是可以分父子依赖关系的。凡是依赖别的项目后,拿到的别的项目的依赖包,都属于传递依赖。
比如:A项目,被B项目依赖。此时A项目中的所有jar包都会传递到B项目中。
B项目开发者,如果再在B项目中导入一套SSM框架的jar包,对于B项目是直接依赖,那么直接依赖的jar包就会把A项目传递过去的jar包覆盖掉。
为防止以上情况的出现,我们可以把A项目中的主要jar包的坐标锁住,那么其他依赖该项目的项目中,即便是有同名jar包直接依赖,也无法覆盖。
如何“锁住jar包”?
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<dependencyManagement>
6.maven项目中的工程
和模块
区别
工程天生只能使用自己内部资源,其天生是独立的。后天可以和其他工程或模块建立关联关系。
模块天生不是独立的,模块天生是属于父工程的。模块一旦创建,所有父工程的资源都可以使用。
关系
父子工程之间,子模块天生继承父工程,可使用父工程所有资源。父子工程之间的继承关系是先天的,不需要手动建立。
子模块之间没有任何关系。
平级之间的引用叫依赖,依赖不是先天的,是需要后天建立的。