目录
一、分模块开发
1、分模块开发设计
2、依赖管理
二、继承和聚合
1、聚合
2、继承
三、属性
1、基本介绍
2、版本管理
四、多环境配置与应用
1、多环境开发
2、跳过测试
五、私服
1、私服安装
2、私服仓库分类
1、分模块开发设计
▶ 示意图
▶ 抽取domai层
▷ 步骤1 : 创建新模块
创建一个名称为`maven_03_pojo`的jar项目。
▷ 步骤2 : 项目中创建domain包
在`maven_03_pojo`项目中创建`com.itheima.domain`包,并将`maven_02_ssm`中Book类拷贝到该包中
▷ 步骤3 : 删除原项目中的domain包
删除后,`maven_02_ssm`项目中用到`Book`的类中都会有红色提示,要想解决这个问题,我们需要在`maven_02_ssm`中添加`maven_03_pojo`的依赖。
▷ 步骤4 : 建立依赖关系
在`maven_02_ssm`项目的pom.xml添加`maven_03_pojo`的依赖
com.itheima maven_03_pojo 1.0-SNAPSHOT 因为添加了依赖,所以在`maven_02_ssm`中就已经能找到Book类,所以刚才的报红提示就会消。
▷ 步骤5 : 将项目安装本地仓库
将需要被依赖的项目`maven_03_pojo`,使用maven的install命令,把其安装到Maven的本地仓库中。
安装成功后,在对应的路径下就看到安装好的jar包
说明: 具体安装在哪里,和你们自己电脑上Maven的本地仓库配置的位置有关。
当执行`maven_02_ssm`的compile的命令后,就已经能够成功编译。其他的模块类似,都是这样拆分。
2、依赖管理
maven基础中有介绍:http://t.csdn.cn/1wBO8
1、聚合
▶ 基本介绍
● 分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目Maven面板的`install`来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较烦的
● 如果四个项目都已经安装成功,当ssm_pojo发生变化后,我们就得将ssm_pojo重新安装到maven仓库,但是为了确保我们对ssm_pojo的修改不会影响到其他项目模块,我们需要对所有的模块进行重新编译,那又需要将所有的模块再来一遍,项目少的话还好,但是如果项目多的话,一个个操作项目就容易出现漏掉或重复操作的问题,所以提出聚合。● 所谓聚合: 将多个模块组织成一个整体,同时进行项目构建的过程称为聚合
● 聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件)
● 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
● 当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。▶ 具体实现骤
▷ 步骤1 : 创建一个空的maven项目
▷ 步骤2 : 将项目的打包方式改为pom
4.0.0 com.itheima maven_01_parent 1.0-RELEASE pom 说明: 项目的打包方式,我们接触到的有三种,分别是
● jar : 默认情况,说明该项目为java项目
● war : 说明该项目为web项目
● pom : 说明该项目为聚合或继承(后面会讲)目▷ 步骤3 : pom.xml添加所要管理的项目
4.0.0 com.itheima maven_01_parent 1.0-RELEASE pom ../maven_02_ssm ../maven_03_pojo ../maven_04_dao ▷ 步骤4 : 使用聚合统一管理项目
测试发现,当`maven_01_parent`的`compile`被点击后,所有被其管理的项目都会被执行编译操作。这就是聚合工程的作用。
说明:聚合工程管理的项目在进行运行的时候,会按照项目与项目之间的依赖关系来自动决定执行的顺序和配置的顺序无关。聚合工程主要是用来管理项目。
2、继承
▶ 基本介绍
完成了使用聚合工程去管理项目,聚合工程进行某一个构建操作,其他被其管理的项目也会执行相同的构建操作。多模块开发存在的另外一个问题,`重复配置`的问题,我们先来看张图:
● `spring-webmvc`、`spring-jdbc`在三个项目模块中都有出现,这样就出现了重复的内容
● `spring-test`只在ssm_crm和ssm_goods中出现,而在ssm_order中没有,这里是部分重复的内容
● 我们使用的spring版本目前是`5.2.10.RELEASE`,假如后期要想升级spring版本,所有跟Spring相关jar包都得被修改,涉及到的项目越多,维护成本越高,面对上面的这些问题,就得用到继承。● 所谓继承 : 描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承。
● 作用:
○ 简化配置
○ 减少版本冲突▶ 具体实现骤
▷ 步骤1 : 创建一个空的Maven项目并将其打包方式设置为pom
因为这一步和前面maven创建聚合工程的方式是一摸一样,所以我们可以单独创建一个新的工程,也可以直接和聚合公用一个工程。实际开发中,聚合和继承一般也都放在同一个项目中,但是这两个的功能是不一样的。
▷ 步骤2 : 在子项目中设置其父工程
分别在`maven_02_ssm`,`maven_03_pojo`,`maven_04_dao`的pom.xml中添加其父项目为`maven_01_parent`
com.itheima maven_01_parent 1.0-RELEASE ../maven_01_parent/pom.xml ▷ 步骤3 : 优化子项目共有依赖导入问题
1. 将子项目共同使用的jar包都抽取出来,维护在父项目的pom.xml中
4.0.0 com.itheima maven_01_parent 1.0-RELEASE pom ../maven_02_ssm ../maven_03_pojo ../maven_04_dao org.springframework spring-core 5.2.10.RELEASE org.springframework spring-webmvc 5.2.10.RELEASE org.springframework spring-jdbc 5.2.10.RELEASE org.springframework spring-test 5.2.10.RELEASE org.mybatis mybatis 3.5.6 org.mybatis mybatis-spring 1.3.0 mysql mysql-connector-java 5.1.47 com.alibaba druid 1.1.16 javax.servlet javax.servlet-api 3.1.0 provided com.fasterxml.jackson.core jackson-databind 2.9.0 2. 删除子项目中已经被抽取到父项目的pom.xml中的jar包,如在`maven_02_ssm`的pom.xml中将已经出现在父项目的jar包删除掉
4.0.0 com.itheima maven_02_ssm 1.0-SNAPSHOT war com.itheima maven_01_parent 1.0-RELEASE ../maven_01_parent/pom.xml junit junit 4.12 test junit junit 4.11 test com.itheima maven_04_dao 1.0-SNAPSHOT log4j log4j org.mybatis mybatis org.apache.tomcat.maven tomcat7-maven-plugin 2.1 80 / 删除完后,你会发现父项目中有依赖对应的jar包,子项目虽然已经将重复的依赖删除掉了,但是刷新的时候,子项目中所需要的jar包依然存在。当项目的`
`标签被移除掉,会发现多出来的jar包依赖也会随之消失。 3. 将`maven_04_dao`项目的pom.xml中的所有依赖删除,然后添加上`maven_01_parent`的父项目坐标
4.0.0 com.itheima maven_04_dao 1.0-SNAPSHOT com.itheima maven_01_parent 1.0-RELEASE ../maven_01_parent/pom.xml 刷新并查看Maven的面板,会发现maven_04_dao同样引入了父项目中的所有依赖。
这样我们就可以解决刚才提到的第一个问题,将子项目中的公共jar包抽取到父工程中进行统一添加依赖,这样做的可以简化配置,并且当父工程中所依赖的jar包版本发生变化,所有子项目中对应的jar包版本也会跟着更新。
▷ 步骤4 : 优化子项目依赖版本问题
如果把所有用到的jar包都管理在父项目的pom.xml,看上去更简单些,但是这样就会导致有很多项目引入了过多自己不需要的jar包。如上面看到的这张图:
如果把所有的依赖都放在了父工程中进行统一维护,就会导致ssm_order项目中多引入了`spring-test`的jar包,如果这样的jar包过多的话,对于ssm_order来说也是一种"负担"。
那针对于这种部分项目有的jar包,该如何管理优化呢?
1. 在父工程mavne_01_parent的pom.xml来定义依赖管理
junit junit 4.12 test 2. 将maven_02_ssm的pom.xml中的junit依赖删除掉,刷新Maven
刷新完会发现,在maven_02_ssm项目中的junit依赖并没有出现,所以我们得到一个结论:
`
`标签不真正引入jar包,而是配置可供子项目选择的jar包依赖子项目要想使用它所提供的这些jar包,需要自己添加依赖,并且不需要指定` ` 3. 在maven_02_ssm的pom.xml添加junit的依赖
junit junit test 注意:这里就不需要添加版本了,这样做的好处就是当父工程dependencyManagement标签中的版本发生变化后,子项目中的依赖版本也会跟着发生变化
4. 在maven_04_dao的pom.xml添加junit的依赖
junit junit test 这个时候,maven_02_ssm和maven_04_dao这两个项目中的junit版本就会跟随着父项目中的标签dependencyManagement中junit的版本发生变化而变化。不需要junit的项目就不需要添加对应的依赖即可。
总结来说,继承可以帮助做两件:(父工程主要是用来快速配置依赖jar包和管理项目中所使用的资源。)
● 将所有项目公共的jar包依赖提取到父工程的pom.xml中,子项目就可以不用重复编写,简化开发
● 将所有项目的jar包配置到父工程的dependencyManagement标签下,实现版本管理,方便维护
○ dependencyManagement标签不真正引入jar包,只是管理jar包的版本
○ 子项目在引入的时候,只需要指定groupId和artifactId,不需要加version
○ 当dependencyManagement标签中jar包版本发生变化,所有子项目中有用到该jar包的地方对应的版本会自动随之更新▶ 聚合与继承的别
▷ 两种之间的作:
● 聚合用于快速构建项目,对项目进行管理
● 继承用于快速配置和管理子项目中所使用jar包的版本▷ 聚合和继承的相同点:
● 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
● 聚合与继承均属于设计型模块,并无实际的模块内容▷ 聚合和继承的不同点:
● 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
● 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己▶ IDEA构建聚合与继承程
▷ 步骤1 : 创建一个Maven项目
创建一个空的Maven项目,可以将项目中的`src`目录删除掉,这个项目作为聚合工程和父工程。
▷ 步骤2 : 创建子项目
该项目可以被聚合工程管理,同时会继承父工程。
创建成功后,maven_parent即是聚合工程又是父工程,maven_web中也有parent标签,继承的就是maven_parent,对于难以配置的内容都自动生成。
1、基本介绍
▶ 图示
▶ 解决骤
▷ 步骤1 : 父工程中定义属性
5.2.10.RELEASE 4.12 1.3.0 ▷ 步骤2 : 修改依赖的version
org.springframework spring-core ${spring.version} org.springframework spring-webmvc ${spring.version} org.springframework spring-jdbc ${spring.version} 此时,我们只需要更新父工程中properties标签中所维护的jar包版本,所有子项目中的版本也就跟着更新。当然除了将spring相关版本进行维护,我们可以将其他的jar包版本也进行抽取,这样就可以对项目中所有jar包的版本进行统一维护,如:
5.2.10.RELEASE 4.12 1.3.0 ▶ 配置文件加载属性
想让Maven对于属性的管理范围能更大些,比如我们之前项目中的`jdbc.properties`,这个配置文件中的属性,能不能也来让Maven进行管理呢?
答案是肯定的,具体的实现步骤:
▷ 步骤1 : 父工程定义属性
jdbc:mysql://127.1.1.1:3306/ssm_db ▷ 步骤2 : jdbc.properties文件中引用属性
在jdbc.properties,将jdbc.url的值直接获取Maven配置的属性
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=${jdbc.url} jdbc.username=root jdbc.password=root
▷ 步骤3 : 设置maven过滤文件范围
Maven在默认情况下是从当前项目的`src\main\resources`下读取文件进行打包。现在我们需要打包的资源文件是在maven_02_ssm下,需要我们通过配置来指定下具体的资源目录。
../maven_02_ssm/src/main/resources true 说明: directory路径前要添加`../`的原因是maven_02_ssm相对于父工程的pom.xml路径是在其上一层的目录中,所以需要添加。
修改完后,注意maven_02_ssm项目的resources目录就多了些东西,如下:
▷ 步骤4 : 测试是否生效
测试的时候,只需要将maven_02_ssm项目进行打包,然后观察打包结果中最终生成的内容是否为Maven中配置的内容。
▶ 问题解决
有一个问题没有解决,因为不只是maven_02_ssm项目需要有属性被父工程管理,如果有多个项目需要配置,该如何实现?
▷ 方式一:
../maven_02_ssm/src/main/resources true ... ../maven_03_pojo/src/main/resources true 可以配,但是如果项目够多的话,这个配置也是比较繁琐
▷ 方式二:
${project.basedir}/src/main/resources true 说明: 打包的过程中如果报如下错误:
原因就是Maven发现你的项目为web项目,就会去找web项目的入口web.xml[配置文件配置的方式],发现没有找到,就会报。
▷ 解决方案1:在maven_02_ssm项目的`src\main\webapp\WEB-INF\`添加一个web.xml文件
▷ 解决方案2 : 配置maven打包war时,忽略web.xml检查
org.apache.maven.plugins maven-war-plugin 3.2.3 false 上面我们所使用的都是Maven的自定义属性,除了${project.basedir},它属于Maven的内置系统属性。
在Maven中的属性分:
○ 自定义属性(常用)
○ 内置属性
○ Setting属性
○ Java系统属性
○ 环境变量属性具体如何查看这些属性:
在cmd命令行中输入`mvn help:system`
具体使用,就是使用 `${key}`来获取,key为等号左边的,值为等号右边的,比如获取红线的值,对应的写法为 `${java.runtime.name}`。
2、版本管理
关于这个版本管理解决的问题是,在Maven创建项目和引用别人项目的时候,我们都看到过如下内容:
在我们jar包的版本定义中,有两个工程版本用的比较多:
● SNAPSHOT(快照版本)
○ 项目开发过程中临时输出的版本,称为快照版本
○ 快照版本会随着开发的进展不断更新
● RELEASE(发布版本)
○ 项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的
○ 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本除了上面的工程版本,我们还经常能看到一些发布版本:
● alpha版 : 内测版,bug多不稳定内部版本不断添加新功能
● beta版 : 公测版,不稳定(比alpha稳定些),bug相对较多不断添加新功能
● 纯数字版
1、多环境开发
● 我们平常都是在自己的开发环境进行开发,
● 当开发完成后,需要把开发的功能部署到测试环境供测试人员进行测试使用,
● 等测试人员测试通过后,我们会将项目部署到生成环境上线使用。
● 这个时候就有一个问题是,不同环境的配置是不相同的,如不可能让三个环境都用一个数据库,所以就会有三个数据库的url配置,
● 我们在项目中如何配置?
● 要想实现不同环境之间的配置切换又该如何来实现呢?▶ 具体实现骤
▷ 步骤1 : 父工程配置多个环境,并指定默认激活环境
env_dep jdbc:mysql://127.1.1.1:3306/ssm_db true env_pro jdbc:mysql://127.2.2.2:3306/ssm_db env_test jdbc:mysql://127.3.3.3:3306/ssm_db ▷ 步骤2 : 执行安装查看env_dep环境是否生效
查看到的结果为:
▷ 步骤3 : 切换默认环境为生产环境
env_dep jdbc:mysql://127.1.1.1:3306/ssm_db env_pro jdbc:mysql://127.2.2.2:3306/ssm_db true env_test jdbc:mysql://127.3.3.3:3306/ssm_db ▷ 步骤4 : 执行安装并查看env_pro环境是否生效
查看到的结果为`jdbc:mysql://127.2.2.2:3306/ssm_db`
虽然已经能够实现不同环境的切换,但是每次切换都是需要手动修改,如何来实现在不改变代码的前提下完成环境的切换呢?
▷ 步骤5 : 命令行实现环境切换
▷ 步骤6 : 执行安装并查看env_test环境是否生效
查看到的结果为`jdbc:mysql://127.3.3.3:3306/ssm_db`
2、跳过测试
前面在执行`install`指令的时候,Maven都会按照顺序从上往下依次执行,每次都会执行`test`,对于`test`来说有它存在的意义,
● 可以确保每次打包或者安装的时候,程序的正确性,假如测试已经通过在我们没有修改程序的前提下再次执行打包或安装命令,由于顺序执行,测试会被再次执行,就有点耗费时间了。
● 功能开发过程中有部分模块还没有开发完毕,测试无法通过,但是想要把其中某一部分进行快速打包,此时由于测试环境失败就会导致打包失败。遇到上面这些情况的时候,我们就想跳过测试执行下面的构建命令,具体实现方:
▶ 方式一 : IDEA工具实现跳过测试
图中的按钮为`Toggle 'Skip Tests' Mode`,Toggle翻译为切换的意思,也就是说在测试与不测试之间进行切换。点击一下,出现测试画横线的图片,如下:
说明测试已经被关闭,再次点击就会恢复。这种方式最简单,但是有点"暴力",会把所有的测试都跳过,如果我们想更精细的控制哪些跳过哪些不跳过,就需要使用配置插件的方式。
▶ 方式二 : 配置插件实现跳过测试
在父工程中的pom.xml中添加测试插件配置
maven-surefire-plugin 2.12.4 false **/BookServiceTest.java skipTests : 如果为true,则跳过所有测试,如果为false,则不跳过测试
excludes:哪些测试类不参与测试,即排除,针对skipTests为false来设置的
includes: 哪些测试类要参与测试,即包含,针对skipTests为true来设置的
▶ 方式三 : 命令行跳过测试
使用Maven的命令行,`mvn 指令 -D skipTests`
注意事项:
● 执行的项目构建指令必须包含测试生命周期,否则无效果。例如执行compile生命周期,不经过test生命周期。
● 该命令可以不借助IDEA,直接使用cmd命令行进行跳过测试,需要注意的是cmd要在pom.xml所在目录下进行执行。
1、私服安装
▶ 简单介绍
● 私服 : 公司内部搭建的用于存储Maven资源的服务器
● 远程仓库 : Maven开发团队维护的用于存储Maven资源的服务器
所以说: 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题
● Nexus
○ Sonatype公司的一款maven私服产品
○ 下载地址:https://help.sonatype.com/repomanager3/product-information/download▶ 私服装
▷ 步骤1 :下载解压
将`资料\latest-win64.zip`解压到一个空目录下。
▷ 步骤2 : 启动Nexus
使用cmd进入到解压目录下的`nexus-3.30.1-01\bin`,执行如下命令:
nexus.exe /run nexus
看到如下内容,说明启动成功。
▷ 步骤3 : 浏览器访问
访问地址为:
http://localhost:8081
▷ 步骤4 : 首次登录重置密码
输入用户名和密码进行登录,登录成功后,出现如下页面
点击下一步,需要重新输入新密码,为了和后面的保持一致,密码修改为`admin`
设置是否运行匿名访问
点击完成
至此私服就已经安装成功。如果要想修改一些基础配置信息,可以使用:
● 修改基础配置信息
○ 安装路径下etc目录中nexus-default.properties文件保存有nexus基础配置信息,例如默认访问端口。
● 修改服务器运行配置信息
○ 安装路径下bin目录中nexus.vmoptions文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间。2、私服仓库分类
▶ 私服资源操作流程分析
(1) 在没有私服的情况下,我们自己创建的服务都是安装在Maven的本地仓库中
(2) 私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中
(3) 其他人要想使用你所上传的资源,就需要从私服的仓库中获取
(4) 当我们要使用的资源不是自己写的,是远程中央仓库有的第三方jar包,这个时候就需要从远程中央仓库下载,每个开发者都去远程中央仓库下速度比较慢(中央仓库服务器在国外)
(5) 私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方jar包,第一次访问没有就会去远程中央仓库下载,下次再访问就直接走私服下载
(6) 前面在介绍版本管理的时候提到过有`SNAPSHOT`和`RELEASE`,如果把这两类的都放到同一个仓库,比较混乱,所以私服就把这两个种jar包放入不同的仓库
(7) 上面我们已经介绍了有三种仓库,一种是存放`SNAPSHOT`的,一种是存放`RELEASE`还有一种是存放从远程仓库下载的第三方jar包,那么我们在获取资源的时候要从哪个仓库种获取呢?
(8) 为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。
所有私服仓库总共分为三大:
● 宿主仓库hosted
保存无法从中央仓库获取的资源
○ 自主研发
○ 第三方非开源项目,比如Oracle,因为是付费产品,所以中央仓库没有● 代理仓库proxy
○ 代理远程仓库,通过nexus访问其他公共仓库,例如中央仓库
● 仓库组group
○ 将若干个仓库组成一个群组,简化配置
○ 仓库组不能保存资源,属于设计型仓库▶ 本地仓库访问私服置
▷ 步骤1 : 私服上配置仓库
说明
● 第5,6步骤是创建itheima-snapshot仓库
● 第7,8步骤是创建itheima-release仓库
▷ 步骤2 : 配置本地Maven对私服的访问权限
itheima-snapshot admin admin itheima-release admin admin ▷ 步骤3 : 配置私服的访问路径
maven-public * http://localhost:8081/repository/maven-public/ 为了避免阿里云Maven私服地址的影响,建议先将之前配置的阿里云Maven私服镜像地址注释掉,等练习完后,再将其恢复。
至此本地仓库就能与私服进行交互了。
▶ 私服资源上传与下载
本地仓库与私服已经建立了连接,接下来就需要往私服上上传资源和下载资源,具体的实现步骤:
▷ 步骤1 : 配置工程上传私服的具体位置
itheima-release http://localhost:8081/repository/itheima-release/ itheima-snapshot http://localhost:8081/repository/itheima-snapshot/ ▷ 步骤2 : 发布资源到私服
或者执行Maven命令
mvn deploy
注意:
要发布的项目都需要配置`distributionManagement`标签,要么在自己的pom.xml中配置,要么在其父项目中配置,然后子项目中继承父项目即可。发布成功,在私服中就能看到:
现在发布是在itheima-snapshot仓库中,如果想发布到itheima-release仓库中就需要将项目pom.xml中的version修改成RELEASE即可。
如果想删除已经上传的资源,可以在界面上进行删除操作:
如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。