1.Maven基础
1.1 Maven是什么
maven 是一个项目管理工具,主要作用是在项目开发阶段对Java项目进行依赖管理和项目构建。
- 依赖管理:就是对jar包的管理。通过导入maven坐标,就相当于将仓库中的jar包导入了当前项目中。
- 项目构建:通过maven的一个命令就可以完成项目从清理、编译、测试、报告、打包,部署整个过程。
1.2 maven的仓库类型
- 本地仓库
- 远程仓库
- maven中央仓库(地址:http://repo2.maven.org/maven2/)
- maven私服(公司局域网内的仓库,需要自己搭建)
- 其他公共远程仓库(例如apache提供的远程仓库,地址:http://repo.maven.apache.org/maven2/)
1.3 maven常用命令
- clean: 清理
- compile:编译
- test: 测试
- package:打包
- install: 安装
1.4 maven坐标书写规范
1.5 maven的依赖范围
2 maven的依赖传递
2.1 什么是依赖传递
在maven中,依赖是可以传递的,假设存在三个项目,分别是项目A,项目B以及项目C。假设C依赖B,B依赖A,那么我们可以根据maven项目依赖的特征不难推出项目C也依赖A。
通过上面的图可以看到,我们的web项目直接依赖了spring-webmvc,而spring-webmvc依赖了sping-aop、spring-beans等。最终的结果就是在我们的web项目中间接依赖了spring-aop、spring-beans等。
2.2 什么是依赖冲突
由于依赖传递现象的存在, spring-webmvc 依赖 spirng-beans-4.2.4,spring-aop 依赖 spring-beans-5.0.2,但是发现 spirng-beans-4.2.4 和spring-beans-5.0.2都加入到了工程中,这时系统可能默认使用spirng-beans-4.2.4, 而我们希望使用spring-beans-5.0.2 。这就造成了依赖冲突。并且我们希望只把spring-beans-5.0.2加入工程。
2.3 如何解决依赖冲突
- 使用maven提供的依赖调解原则
第一声明者优先原则
路径近者优先原则 - 排除依赖
- 锁定版本(最常用)
2.3.1 使用maven提供的依赖调解原则
第一声明者优先原则:
在 pom 文件中定义依赖,以先声明的依赖为准。其实就是根据坐标导入的顺序来确定最终使用哪个传递过来的依赖。即把想要的坐标写在前面即可。
路径近者优先原则:
在 pom 文件定义依赖,以路径近者为准。还是上述情况,spring-aop 和 spring-webmvc 都会传递过来 spirng-beans,那如果直接把 spring-beans 的依赖直接写到 pom 文件中,那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在 pom 中定义spring-beans要比其他依赖传递过来的路径要近。
2.3.2 排除依赖
可以使用exclusions标签将传递过来的依赖排除出去。
通过上图可以看到,spring-webmvc传递过来的4.2.4版本的springbeans已经被排除出去了,项目中使用的为spring-aop传递过来的5.0.2版本的spring-beans
2.3.3 版本锁定
采用直接锁定版本的方法确定依赖jar包的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本为准添加到工程中,此方法在企业开发中经常使用。
版本锁定的使用方式:
- 第一步:在dependencyManagement标签中锁定依赖的版本
注意:pom文件中使用dependencyManagement标签进行依赖jar的版本锁定,并不会真正将jar包导入到项目中,只是对这些jar的版本进行锁定。项目中使用哪些jar包,还需要在dependencies标签中进行声明。
- 第二步:在dependencies标签中声明需要导入的maven坐标
3 分模块构建maven工程
在企业项目开发过程中,由于项目规模庞大,业务复杂,参与的人员比较多,一般会通过合理的模块拆分将一个大型的项目拆分为N多个小模块,分别进行开发。而且拆分出的模块可以非常容易的被其他模块复用。
常见的拆分方式有两种:
-
第一种:按照业务模块进行拆分,每个模块拆分成一个maven工程,例如将一个项目分为用户模块、订单模块、购物车模块等,每个模块对应就是一个maven工程(比如:IDEA中的一个Module)
-
第二种:按照层进行拆分,例持久层、业务层、表现层等,每个层对应就是一个maven工程(比如:IDEA中的一个Module)
不管是上面哪种拆分方式,通常都会提供一个父工程,将一些公共的代码和配置提取到父工程中进行统一管理和配置。
3.1 maven工程的继承
在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。
被继承的maven工程通常称为父工程,父工程的打包方式必须为pom,所以我们区分某个maven工程是否为父工程就看这个工程的打包方式是否为pom
继承其他maven父工程的工程通常称为子工程,在pom.xml文件中通过parent标签进行父工程的继承
3.2 maven工程的聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。
例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
需要注意的是:继承与聚合没有必然的关系,即使两个模块之间没有继承关系也是可以聚合的。
4 maven私服
4.1 maven私服介绍
maven仓库分为本地仓库和远程仓库,而远程仓库又分为maven中央仓库、其他远程仓库和私服(私有服务器)。其中,中央仓库是由maven官方提供的,而私服就需要我们自己搭建了。
maven私服就是公司局域网内的maven远程仓库,每个员工的电脑上安装maven软件并且连接maven私服,程序员可以将自己开发的项目打成jar并发布到私服,其它项目组成员就可以从私服下载所依赖的jar。私服还充当一个代理服务器的角色,当私服上没有jar包时会从maven中央仓库自动下载。
nexus 是一个maven仓库管理器(其实就是一个软件),nexus可以充当maven私服,同时nexus还提供强大的仓库管理、构件搜索等功能。
4.2 搭建maven私服
下载地址url:
https://help.sonatype.com/repomanager2/download/download-archives—repository-manager-oss
连接:下载地址
安装步骤:
- 将下载的压缩包进行解压,进入bin目录
- 打开cmd窗口并进入上面bin目录下,执行nexus.bat install命令安装服务(注意需要以管理员身份运行cmd命令)
- 启动nexus,在命令行执行nexus.bat start命令启动nexus
- 访问nexus
- 启动nexus服务后,访问http://localhost:8081/nexus
- 点击右上角LogIn按钮,进行登录。使用默认用户名admin和密码admin123登录系统
- 登录成功后点击左侧菜单Repositories可以看到nexus内置的仓库列表
nexus仓库类型:
通过前面的仓库列表可以看到,nexus默认内置了很多仓库,这些仓库可以划分为4种类型,每种类型的仓库用于存放特定的jar包,具体说明如下:
- hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括Releases和Snapshots两部分,Releases为公司内部发布版本仓库、 Snapshots为公司内部测试版本仓库。
- proxy,代理仓库,用于代理远程的公共仓库,如maven中央仓库,用户连接私服,私服自动去中央仓库下载jar包或者插件。
- group,仓库组,用来合并多个hosted/proxy仓库,通常我们配置自己的maven连接仓库组。
- virtual(虚拟):兼容Maven1版本的jar或者插件
4.3 将项目发布到maven私服
maven私服是搭建在公司局域网内的maven仓库,公司内的所有开发团队都可以使用。例如技术研发团队开发了一个基础组件,就可以将这个基础组件打成jar包发布到私服,其他团队成员就可以从私服下载这个jar包到本地仓库并在项目中使用。
将项目发布到maven私服操作步骤如下:
- 配置maven的settings.xml文件
<server>
<id>releases</id>
<username>admin</username>
<password>admin123</password>
</server>
<server>
<id>snapshots</id>
<username>admin</username>
<password>admin123</password>
</server>
注意:一定要在idea工具中引入的maven的settings.xml文件中配置
2. 配置项目的pom.xml文件
<distributionManagement>
<repository>
<id>releases</id>
<url>http://localhost:8081/nexus/content/repositories/releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://localhost:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
注意:pom.xml文件的的值和前面配置的settings.xml 文件的值需要一致
3. 执行mvn deploy命令
4.4 从私服下载jar到本地仓库
具体操作步骤如下:
- 在maven的settings.xml文件中配置下载模板
- 在maven的settings.xml文件中配置激活下载模板
<activeProfiles>
<activeProfile>dev</activeProfile>
</activeProfiles>
4.5 将第三方jar安装到本地仓库和maven私服
在maven工程的pom.xml文件中配置某个jar包的坐标后,如果本地的maven仓库不存在这个jar包,maven工具会自动到配置的maven私服下载,如果私服中也不存在,maven私服就会从maven中央仓库进行下载。
但是并不是所有的jar包都可以从中央仓库下载到,比如常用的Oracle数据库驱动的jar包在中央仓库就不存在。此时需要到Oracle的官网下载驱动jar包,然后将此jar包通过maven命令安装到我们本地的maven仓库或者maven私服中,这样在maven项目中就可以使用maven坐标引用到此jar包了。
4.5.1 将第三方jar安装到本地仓库
- 下载Oracle的jar包(略)
- mvn install命令进行安装
mvn install:install-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 –Dversion=10.2.0.4.0 -Dpackaging=jar
- 查看本地maven仓库,确认安装是否成功
4.5.2 将第三方jar安装到maven私服
- 下载Oracle的jar包(略)
- 在maven的settings.xml配置文件中配置第三方仓库的server信息
<server>
<id>thirdparty</id>
<username>admin</username>
<password>admin123</password>
</server>
- 执行mvn deploy命令进行安装
mvn deploy:deploy-file -Dfile=ojdbc14-10.2.0.4.0.jar -DgroupId=com.oracle -DartifactId=ojdbc14 –
Dversion=10.2.0.4.0 -Dpackaging=jar –
Durl=http://localhost:8081/nexus/content/repositories/thirdparty/ -DrepositoryId=thirdparty