目录
1.分模块开发
1.1分模块开发设计
![](https://i-blog.csdnimg.cn/blog_migrate/c4ed511d4b26405fadb208d373863fc7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/65bb40f040a35e3f45192446204ccad1.png)
1.2 分模块开发实现
1.2.1 环境准备
![](https://i-blog.csdnimg.cn/blog_migrate/1b8494ca4c5b57ac85dc8f5d55a23382.png)
1.2.2 抽取domain层
![](https://i-blog.csdnimg.cn/blog_migrate/9f0d790c72cb83a7f25998566bb2f065.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d07cadde694c8b3b4cb179799da31938.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a266d4940a0230d281332105e521c46d.png)
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
步骤5:编译maven_02_ssm项目
![](https://i-blog.csdnimg.cn/blog_migrate/ddd24ad8af72083a7a514905cd7ddc35.png)
![](https://i-blog.csdnimg.cn/blog_migrate/069bcf940ba68d92ba14f15599e925c5.png)
安装成功后,在对应的路径下就看到安装好的jar包
说明:具体安装在哪里,和你们自己电脑上Maven的本地仓库配置的位置有关。
1.2.3 抽取Dao层
步骤2:项目中创建dao包
在maven_04_dao项目中创建com.itheima.dao包,并将maven_02_ssm中BookDao类拷贝到该包
中
![](https://i-blog.csdnimg.cn/blog_migrate/f549135b42b16b6b83f1ecf28ad51eb9.png)
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--依赖dao运行-->
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
![](https://i-blog.csdnimg.cn/blog_migrate/539d60fc14813287cbd99def721145d2.png)
再次对maven_02_ssm项目进行编译,又会报错,如下
安装成功后,在对应的路径下就看到了安装好对应的jar包
1.2.4 运行测试并总结
将抽取后的项目进行运行,测试之前的增删改查功能依然能够使用。所以对于项目的拆分,大致会有如下几个步骤 :(1) 创建 Maven 模块(2) 书写模块代码分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分。拆分方式可以按照功能拆也可以按照模块拆。(3) 通过 maven 指令安装模块到本地仓库 (install 指令 )团队内部开发需要发布模块功能到团队内部可共享的仓库中 ( 私服 ) ,私服我们后面会讲解。
2.1 依赖传递与冲突问题
![](https://i-blog.csdnimg.cn/blog_migrate/18d9b7b3c9143d8fb35d2d177e88088f.png)
在项目所依赖的这些jar包中,有一个比较大的区别就是有的依赖前面有箭头> ,有的依赖前面没有。
你会发现有两个maven_03_pojo的依赖被加载到Dependencies中,那么maven_04_dao中的
![](https://i-blog.csdnimg.cn/blog_migrate/d4860d58578bfd92c9a0c9dc98387b40.png)
![](https://i-blog.csdnimg.cn/blog_migrate/55be8e05afc0936221a5d4227ed7415a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/defe4798c838b100830a1b79b86bf6ec.png)
说明 : A 代表自己的项目; B,C,D,E,F,G 代表的是项目所依赖的 jar 包; D1 和 D2 E1 和 E2 代表是相同 jar 包的不同版本(1) A 依赖了 B 和 C,B 和 C 有分别依赖了其他 jar 包,所以在 A 项目中就可以使用上面所有 jar 包,这就是所说的依赖传递(2) 依赖传递有直接依赖和间接依赖相对于 A 来说, A 直接依赖 B 和 C, 间接依赖了 D1,E1,G , F,D2 和 E2相对于 B 来说, B 直接依赖了 D1 和 E1, 间接依赖了 G直接依赖和间接依赖是一个相对的概念(3) 因为有依赖传递的存在,就会导致 jar 包在依赖的过程中出现冲突问题,具体什么是冲突 ?Maven是如何解决冲突的 ?这里所说的 依赖冲突 是指项目依赖的某一个 jar 包,有多个不同的版本,因而造成类包版本冲突。
![](https://i-blog.csdnimg.cn/blog_migrate/0da92f3245e2178442bfc330b82bdf84.png)
如果想更全面的查看Maven中各个坐标的依赖关系,可以点击Maven面板中的show Dependencies
2.2 可选依赖和排除依赖
2.2.1 方案一:可选依赖
<dependency>
<groupId>com.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递性-->
<optional>false</optional>
</dependency>
2.2.2方案二:排除依赖
<!--排除依赖是隐藏当前资源对应的依赖关系-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
A 依赖 B,B 依赖 C , C 通过依赖传递会被 A 使用到,现在要想办法让 A 不去依赖 C可选依赖是在 B 上设置 <optional> , A 不知道有 C 的存在,排除依赖是在 A 上设置 <exclusions> , A 知道有 C 的存在,主动将其排除掉。
3,聚合和继承
3.1聚合
分模块开发后,需要将这四个项目都安装到本地仓库,目前我们只能通过项目 Maven 面板的install 来安装,并且需要安装四个,如果我们的项目足够多,那么一个个安装起来还是比较麻烦 的如果四个项目都已经安装成功,当 ssm_pojo 发生变化后,我们就得将 ssm_pojo 重新安装到maven 仓库,但是为了确保我们对 ssm_pojo 的修改不会影响到其他项目模块,我们需要对所有的模块进行重新编译,那又需要将所有的模块再来一遍项目少的话还好,但是如果项目多的话,一个个操作项目就容易出现漏掉或重复操作的问题,所以我 们就想能不能抽取一个项目,把所有的项目管理起来,以后我们要想操作这些项目,只需要操作这一 个项目,其他所有的项目都走一样的流程,这个不就很省事省力。这就用到了我们接下来要讲解的 聚合 ,所谓聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件)作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。
步骤1:创建一个空的maven项目
步骤2:将项目的打包方式改为pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-RELEASE</version>
<packaging>pom</packaging>
说明 : 项目的打包方式,我们接触到的有三种,分别是jar: 默认情况,说明该项目为 java 项目war: 说明该项目为 web 项目pom: 说明该项目为聚合或继承 ( 后面会讲 ) 项目
步骤3:pom.xml添加所要管理的项目
<!--设置管理的模块名称-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
步骤4:使用聚合统一管理项目
3.2 继承
spring-webmvc、spring-jdbc在三个项目模块中都有出现,这样就出现了重复的内容
![](https://i-blog.csdnimg.cn/blog_migrate/88b50cb22cef39d69bb802543b9cc1d4.png)
步骤3:优化子项目共有依赖导入问题
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
![](https://i-blog.csdnimg.cn/blog_migrate/fd167343e0f8e0310b837b35dde8f6dd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/42071cdd5fd908312b19ec081de4569c.png)
<!--定义依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
![](https://i-blog.csdnimg.cn/blog_migrate/22f6118e310c1648143f1dff01d83585.png)
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
总结来说,继承可以帮助做两件事将所有项目公共的 jar 包依赖提取到父工程的 pom.xml 中,子项目就可以不用重复编写,简化开发将所有项目的 jar 包配置到父工程的 dependencyManagement 标签下,实现版本管理,方便维护dependencyManagement 标签不真正引入 jar 包,只是管理 jar 包的版本子项目在引入的时候,只需要指定 groupId 和 artifactId ,不需要加 version当 dependencyManagement 标签中 jar 包版本发生变化,所有子项目中有用到该 jar 包的地方对应的版本会自动随之更新最后总结一句话就是, 父工程主要是用来快速配置依赖 jar 包和管理项目中所使用的资源 。
3.2.1小结
继承的实现步骤 :1.创建 Maven 模块,设置打包类型为 pom2.在父工程的 pom 文件中配置依赖关系 ( 子工程将沿用父工程中的依赖关系 ), 一般只抽取子项目中公有的 jar 包3.在父工程中配置子工程中可选的依赖关系4.在子工程中配置当前工程所继承的父工程5.在子工程中配置使用父工程中可选依赖的坐标
3.3 聚合与继承的区别
3.3.1 聚合与继承的区别
两种之间的作用:聚合用于快速构建项目,对项目进行管理继承用于快速配置和管理子项目中所使用jar 包的版本聚合和继承的相同点:聚合与继承的pom.xml 文件打包方式均为 pom ,可以将两种关系制作到同一个 pom 文件中聚合与继承均属于设计型模块,并无实际的模块内容聚合和继承的不同点:聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
4,属性
4.1 属性
4.1.1依赖版本管理
4.1.2 解决步骤
![](https://i-blog.csdnimg.cn/blog_migrate/b60568540c04cde01eb5a55100a0c89e.png)
步骤2:修改依赖的version此时,我们只需要更新父工程中properties标签中所维护的jar包版本,所有子项目中的版本也就跟
4.2 配置文件加载属性
步骤1:父工程定义属性
![](https://i-blog.csdnimg.cn/blog_migrate/92eb4c728b1468ad7d84e8ef1c1ce902.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f75fb4c97579eba18857d0a52c2f5bf7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e5db2b7841e17932dded5cf0dfaefdf8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/02e2b0628099aeb115158dcca807083a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/72b152826b30b0ccb2d09008c806e990.png)
方式二:
说明:打包的过程中如果报如下错误:
解决方案2: 配置maven打包war时,忽略web.xml检查
![](https://i-blog.csdnimg.cn/blog_migrate/826b331d8694fcc607305edd1b149581.png)
4.3 版本管理
![](https://i-blog.csdnimg.cn/blog_migrate/b46285fe079acd5b445e88147f404021.png)
在我们 jar 包的版本定义中,有两个工程版本用的比较多 :SNAPSHOT(快照版本)项目开发过程中临时输出的版本,称为快照版本快照版本会随着开发的进展不断更新RELEASE(发布版本)项目开发到一定阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本除了上面的工程版本,我们还经常能看到一些发布版本 :alpha版: 内测版, bug 多不稳定内部版本不断添加新功能beta版: 公测版,不稳定 ( 比 alpha 稳定些 ) , bug 相对较多不断添加新功能纯数字版
5,多环境配置与应用
5.1 多环境开发![](https://i-blog.csdnimg.cn/blog_migrate/e7dd0a4e4751a8b5c4e68075d95b08ff.png)
<!--配置多环境-->
<profiles>
<!--开发环境-->
<profile>
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url>
</properties>
<!--设定是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--生产环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!--测试环境-->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.3.3.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
![](https://i-blog.csdnimg.cn/blog_migrate/7f54128a6fa61b37be431ea1fba08bd4.png)
步骤3:切换默认环境为生产环境
![](https://i-blog.csdnimg.cn/blog_migrate/19cd036dcf7659874ebdab6f7d704518.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ef0f6286e4f94258244b0e241d9273da.png)
![](https://i-blog.csdnimg.cn/blog_migrate/36d8b2be2400ae1b9f5961ce518dc0c8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/418c827e1a605fd929314c4afc1fac19.png)
5.2 跳过测试
![](https://i-blog.csdnimg.cn/blog_migrate/649989859b2b08d91c8d439871006656.png)
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<skipTests>false</skipTests>
<!--排除掉不参与测试的内容-->
<excludes>
<exclude>**/BookServiceTest.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
skipTests: 如果为 true ,则跳过所有测试,如果为 false ,则不跳过测试excludes :哪些测试类不参与测试,即排除,针对 skipTests 为 false 来设置的includes: 哪些测试类要参与测试,即包含 , 针对 skipTests 为 true 来设置的
![](https://i-blog.csdnimg.cn/blog_migrate/26b5f44eade10d6f780e86fd1be1e610.png)
6,私服
6.1 私服简介
![](https://i-blog.csdnimg.cn/blog_migrate/7e7f76330b344403fa64fb98e2e34022.png)
6.2 私服安装
![](https://i-blog.csdnimg.cn/blog_migrate/dcc3a2110aebd34e6618f75d2c3691b3.png)
使用cmd进入到解压目录下的nexus-3.30.1-01\bin ,执行如下命令: nexus.exe /run nexus
![](https://i-blog.csdnimg.cn/blog_migrate/ea375c3003cae1a2d5b68b58210addf4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b94adbed06791d6b6907d78179aac5cd.png)
输入用户名和密码进行登录,登录成功后,出现如下页面
点击下一步,需要重新输入新密码,为了和后面的保持一致,密码修改为admin
设置是否运行匿名访问
点击完成
至此私服就已经安装成功。如果要想修改一些基础配置信息,可以使用:
6.3 私服仓库分类
![](https://i-blog.csdnimg.cn/blog_migrate/c5bc2c223322db3820294dde71eb1dbb.png)
(1) 在没有私服的情况下,我们自己创建的服务都是安装在 Maven 的本地仓库中(2) 私服中也有仓库,我们要把自己的资源上传到私服,最终也是放在私服的仓库中(3) 其他人要想使用你所上传的资源,就需要从私服的仓库中获取(4) 当我们要使用的资源不是自己写的,是远程中央仓库有的第三方 jar 包,这个时候就需要从远程中央仓库下载,每个开发者都去远程中央仓库下速度比较慢 ( 中央仓库服务器在国外 )(5) 私服就再准备一个仓库,用来专门存储从远程中央仓库下载的第三方 jar 包,第一次访问没有就会去远程中央仓库下载,下次再访问就直接走私服下载(6) 前面在介绍版本管理的时候提到过有 SNAPSHOT 和 RELEASE ,如果把这两类的都放到同一个仓库,比较混乱,所以私服就把这两个种 jar 包放入不同的仓库(7) 上面我们已经介绍了有三种仓库,一种是存放 SNAPSHOT 的,一种是存放 RELEASE 还有一种是存放从远程仓库下载的第三方 jar 包,那么我们在获取资源的时候要从哪个仓库种获取呢 ?(8) 为了方便获取,我们将所有的仓库编成一个组,我们只需要访问仓库组去获取资源。所有私服仓库总共分为三大类 :宿主仓库hosted保存无法从中央仓库获取的资源自主研发第三方非开源项目 , 比如 Oracle, 因为是付费产品,所以中央仓库没有代理仓库proxy代理远程仓库,通过 nexus 访问其他公共仓库,例如中央仓库仓库组group将若干个仓库组成一个群组,简化配置仓库组不能保存资源,属于设计型仓库
![](https://i-blog.csdnimg.cn/blog_migrate/b71602c5f7fc390915be7eb7906363cc.png)
6.4 本地仓库访问私服配置
![](https://i-blog.csdnimg.cn/blog_migrate/733b286874a3bd70f90945a43803bfdf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c0afbf5f7dfc6bf2e7a16d68f53ae8e4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1a1bb4ecbe8ecaebe7140ed3c9d40b27.png)
步骤3:配置私服的访问路径
6.5 私服资源上传与下载
<!--配置当前工程保存在私服中的具体位置-->
<distributionManagement>
<repository>
<id>itheima-release</id>
<url>http://localhost:8081/repository/itheima-release/</url>
</repository>
<snapshotRepository>
<id>itheima-snapshot</id>
<url>http://localhost:8081/repository/itheima-snapshot/</url>
</snapshotRepository>
</distributionManagement>
![](https://i-blog.csdnimg.cn/blog_migrate/da5dfd7070477489c5f9cc71525069dc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a877330beafac57ca930cff3bdbaa06f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d810128495b8b956f4436a29e7b0a740.png)
如果私服中没有对应的jar,会去中央仓库下载,速度很慢。可以配置让私服去阿里云中下载依赖。