分模块开发设计
分模块开发意义
- 将原始模块按照功能拆分成若干个子模块,方便模块见的相互调用,接口共享
步骤:
①创建Maven模块
②书写模块代码
- 注意:分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后再进行拆分
public interface BookDao {
// @Insert("insert into tbl_book values(null,#{type},#{name},#{description})")
@Insert("insert into tbl_book(type, name, description) values(#{type},#{name},#{description})")
public int save(Book book);
@Update("update tbl_book set type=#{type},name=#{name},description=#{description} where id=#{id}")
public int update(Book book);
@Delete("delete from tbl_book where id=#{id}")
public int delete(Integer id);
@Select("select * from tbl_book where id=#{id}")
public Book getById(Integer id);
@Select("select * from tbl_book")
public List<Book> getAll();
}
public class Book {
private Integer id;
private String type;
private String name;
private String description;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", type='" + type + '\'' +
", name='" + name + '\'' +
", description='" + description + '\'' +
'}';
}
}
③通过maven指令安装模块到本地仓库(install指令)
- 团队内部开发需要发布功能模块到团队内部可以共享的仓库中(私服)
依赖管理
- 依赖指当前项目所需要的jar,一个项目可以设置多个依赖
- 格式:
<dependency>
<groupId>org.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
依赖传递
- 依赖具有传递性,可以不用重复写
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题
-
当间接依赖与直接依赖或者间接依赖出现相同的资源版本却不同时
-
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
-
声明优先:当资源在相同层次被依赖时,配置顺序靠前的覆盖配置顺序靠后的
-
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的,这里指的是在一个pom文件中写了多个相同资源的不同版本
-
查看依赖图:
可选依赖与排除依赖
-
防止版本冲突,隐藏自己模块的依赖
-
可选依赖指对外隐藏当前所依赖的资源–不透明
<dependency>
<groupId>org.itheima</groupId>
<artifactId>maven_03_pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- //可选依赖时隐藏当前工程的资源,隐藏后对应资源将不再具有依赖性-->
<!-- <optional>true</optional>-->
</dependency>
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本–不需要
<dependency>
<groupId>org.itheima</groupId>
<artifactId>maven_04_dao</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- //排除依赖是隐藏当前资源对应的依赖关系-->
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
聚合
- 聚合:将多个模块组织成一个整体,同时进行项目构建的过程被称之为聚合
- 聚合工程:通常是一个不具有业务功能的“空”工程(有且仅有一个pom文件)
- 作用:使用聚合工程可以将多个工程编组,通过对聚合工程进行构建,实现对所包含的模块进行同步构建
- 当工程中某个模块发生更新(变更)时,必须保障工程中已更新模块模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题
步骤:
①创建Maven模块,设置打包为pom
<!-- 说明这是一个聚合工程-->
<packaging>pom</packaging>
- 每个maven工程都有对应的打包方式,默认为jar,web工程打包方式为war
②设置当前聚合工程所包含的子模块名称
<groupId>org.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 说明这是一个聚合工程-->
<packaging>pom</packaging>
<!-- 设置管理的模块名称-->
<!-- 这里顺序不会影响根据依赖打包-->
<modules>
<module>../maven_02_ssm</module>
<module>../maven_03_pojo</module>
<module>../maven_04_dao</module>
</modules>
- 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关,参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合
继承
-
概念:继承描述的是两个工程间的关系,与java中的继承相似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承
-
作用:
- 简化版本
- 减少版本冲突
步骤:
①创建Maven模块,设置打包类型为pom
<groupId>org.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 说明这是一个聚合工程-->
<packaging>pom</packaging>
- 建议工程打包方式设置为pom,一般来说父工程(聚合工程)就是继承工程
②在父工程的pom文件中配置依赖关系(子工程将沿用父工程中的依赖关系)
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
......
</dependencies>
③配置子工程中可选的依赖
<!-- 定义依赖管理-->
<!-- 这是一个可选依赖,如果自己有一个版本就会覆盖,可以在项目中不写版本,会使用父工程的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
.......
</dependencies>
</dependencyManagement>
④在子工程中配置当前工程所继承的父工程
<!-- 配置当前工程继承自parent工程-->
<parent>
<groupId>org.itheima</groupId>
<artifactId>maven_01_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- //快速定位工程-->
<!-- 填写父工程的pom文件-->
<relativePath>../maven_01_parent/pom.xml</relativePath>
</parent>
⑤在子工程中配置使用父工程中可选依赖坐标
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!-- 会覆盖父工程中可选依赖坐标<version>4.12</version>-->
<scope>test</scope>
</dependency>
- 子工程中使用父工程中的可选依赖时,仅需提供群组id和项目id,无需提供版本,版本由父工程统一提供,避免版本冲突,子工程中还可以定义父工程中没有定义的依赖关系
聚合与继承的区别
- 作用
- 聚合用于快速构建项目
- 继承用于快速配置项目
- 相同点:
- 聚合与继承的pom.xml文件打包方式均为pom,可以将两种关系制作到同一个pom文件中
- 聚合与继承均属于设计型模块,并无实际的内容
- 不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己
属性
①定义属性
<!-- 定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
②引用属性
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
配置文件加载属性
资源文件引用属性
①定义属性
<!-- 定义属性-->
<properties>
<spring.version>5.2.10.RELEASE</spring.version>
<junit.version>4.12</junit.version>
<jdbc.url>jdbc:mysql://localhost:3306/ssm_db</jdbc.url>
</properties>
②配置文件中引用属性
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=12345678
③开启资源文件目录加载属性的过滤器
<build>
<resources>
<resource>
<!-- <directory>../maven_02_ssm_src/main/resources</directory>-->
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
④配置maven打war包时,忽略web.xml的检查
- 在需要引用资源的pom当中
<!-- //用于有资源文件的打包-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<!-- 取消报错-->
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
其他属性(了解)
- 属性列表
- 1.自定义属性(常用)
- 2.内置属性
- 3.Setting属性
- 4.Java系统属性
- 5.环境变量属性
属性分类 | 引用格式 | 示例 |
---|---|---|
自定义属性 | ${自定义属性名} | ${spring.version} |
内置属性 | ${内置属性名} | ${basedir} ${version} |
Settin属性 | ${setting.属性名} | ${settings.localRepository} |
Java系统属性 | ${系统属性分类.系统属性名} | ${user.home} |
环境变量属性 | ${env.环境变量属性名} | ${env.JAVA_HOME} |
版本管理
- 工程版本:
- SNAPSHOT(快照版本)
- 项目开发过程中临时输出的版本,成为快照版本
- 快照版本会随着开发的进展不断更新
- RELEASE(发布版本)
- 项目开发进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本对应的构件文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本成为发布版本
- SNAPSHOT(快照版本)
- 发布版本
- alpha版(测试版)
- beta版(抢先版)
- 纯数字版(正式版)
多环境开发
- maven提供了配置多种环境的设定
步骤
①定义多环境(将一系列属性设置成一个组)
<!-- 配置多环境-->
<profiles>
<profile>
<!-- //开发环境-->
<id>env_dep</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
<!-- 设定是否为默认启动环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 生产环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.2:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!-- 测试环境-->
<profile>
<id>env_test</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.3:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
②使用多环境(构建过程)
mvn 指令 -P 环境定义id
范例:
mvn install -P pro_env
跳过测试
- 应用场景
- 功能更新中并且没有开发完毕
- 快速打包
- …
跳过测试
mvn 指令 -D skipTests
- 范例
mvn install -D skipTests
- 除此之外,IDEA中的跳过测试可以禁止整个项目的测试
- 注意:执行的项目指令必须包含测试生命周期,否则无效果,例如执行compile生命周期,不经过test生命周期
细粒度控制跳过测试
<build>
<!-- //设定测试插件-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<!-- 跳过测试-->
<configuration>
<skipTests>false</skipTests>
<!-- 排除掉不参与测试的内容,指定测试内容是includes标签-->
<excludes>
<!-- 排除类-->
<exclude>
**/BookServiceTest.java
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
私服(Nexus)
简介
-
私服是一台独立的服务器,用于解决团体内部的资源共享与资源同步问题
-
Nexus
- Sonatype公司的一款maven私服产品
安装与启动
- 下载地址:(官网已经失效,下面的下载链接还有效,当前时间为2022年7月28日01时01分)
windows版本:https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-latest-bundle.zip
Linux版本:https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-latest-bundle.tar.gz
- 启动服务器(命令行启动)
nexus.exe /run nexus
(注意解压所在路径不能有中文名称)
- 访问服务器(默认端口号:8081)
http://localhost:8081
-
修改基础配置信息
- 安装路劲下etc目录中nexys-default.properties文件保存有nexus基础配置信息,例如默认访问端口
-
修改服务器运行配置信息
- 安装路径下bin目录中nexus.vmoption文件保存有nexus服务器启动对应的配置信息,例如默认占用内存空间
-
安装打开时间有点长,耐心等待。。。。。。
私服资源操作流程分析
私服资源的上传与下载
步骤:
①配置位置Maven的config包下的setting.xml文件中
<servers>
<!-- 配置访问私服的权限 -->
<server>
<!-- 私服中的id名称 -->
<id>itheima-snapshot</id>
<username>admin</username>
<password>admin</password>
</server>
<server>
<!-- 私服中的id名称 -->
<id>itheima-release</id>
<username>admin</username>
<password>admin</password>
</server>
</servers>
<mirrors>
<!-- 阿里云中央仓库镜像地址 -->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
<!-- 私服的访问路径,除了name其他都是必要的 -->
<mirror>
<id>maven-public</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
②工程上传到私服服务器设置
- 配置位置(工程pom文件中)
<!-- 配置当前工程在私服中的具体仓库文职-->
<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>
- 发布命令
mvn deploy
③私服访问中央服务器设置
- 配置位置(nexus服务器页面设置)