第一章:分模块开发和设计
1.1 项目目录结构

1.2 相关模块及代码
1.2.1 maven-ssm
- pom.xml
<?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.xudaxian</groupId><artifactId>maven-ssm</artifactId><version>1.0</version><!-- 定义该工程用于进行构建管理 --><packaging>pom</packaging><!-- 管理的工程列表 --><modules><!-- 具体的工程名称 --><module>maven-ssm-pojo</module><module>maven-ssm-dao</module><module>maven-ssm-service</module><module>maven-ssm-web</module></modules><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><!-- 声明此处进行依赖管理 --><dependencyManagement><!-- 具体的依赖 --><dependencies><!-- 自定义工程依赖 --><dependency><groupId>com.xudaxian</groupId><artifactId>maven-ssm-service</artifactId><version>1.0</version></dependency><dependency><groupId>com.xudaxian</groupId><artifactId>maven-ssm-pojo</artifactId><version>1.0</version></dependency><dependency><groupId>com.xudaxian</groupId><artifactId>maven-ssm-dao</artifactId><version>1.0</version></dependency><!-- spring的环境 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><!-- Spring整合Junit --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.1.9.RELEASE</version></dependency><!-- mybatis的环境 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!--mysql环境--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency><!--spring整合jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!--spring整合mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.3</version></dependency><!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.16</version></dependency><!--分页插件坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency></dependencies></dependencyManagement><!--可以在子工程中定义依赖关系,无需声明依赖版本,版本将参考父工程中依赖的版本。当然,我直接定义在父工程了。--><dependencies><!-- spring的环境 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><!-- Spring整合Junit --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><!-- mybatis的环境 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><!--mysql环境--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--spring整合jdbc--><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><!--spring整合mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency><!--druid连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><!--分页插件坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency></dependencies><build><pluginManagement><plugins><!--具体的插件配置--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins></pluginManagement></build></project>
1.2.2 maven-ssm-pojo
- 目录结构:

- pom.xml
<?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"><parent><artifactId>maven-ssm</artifactId><groupId>com.xudaxian</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>maven-ssm-pojo</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties></project>
- com.xudaxian.domain.User.java
package com.xudaxian.domain;import java.io.Serializable;import java.util.Date;/*** User** @author 许大仙* @version 1.0* @since 2021 -06-14 07:25*/public class User implements Serializable {private String uuid;private String username;private String password;private String realName;private Integer gender;private Date birthday;public String getUuid() {return uuid;}public void setUuid(String uuid) {this.uuid = uuid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getRealName() {return realName;}public void setRealName(String realName) {this.realName = realName;}public Integer getGender() {return gender;}public void setGender(Integer gender) {this.gender = gender;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"uuid='" + uuid + '\'' +", username='" + username + '\'' +", password='" + password + '\'' +", realName='" + realName + '\'' +", gender=" + gender +", birthday=" + birthday +'}';}}
1.2.3 maven-ssm-dao
- 目录结构:

- pom.xml
<?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"><parent><artifactId>maven-ssm</artifactId><groupId>com.xudaxian</groupId><version>1.0</version></parent><modelVersion>4.0.0</modelVersion><artifactId>maven-ssm-dao</artifactId><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><!-- 导入资源文件pojo --><dependency><groupId>com.xudaxian</groupId><artifactId>maven-ssm-pojo</artifactId></dependency><!-- 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies></project>
- com.xudaxian.mapper.UserMapper.java
package com.xudaxian.mapper;import com.xudaxian.domain.User;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import java.util.List;/*** @author 许大仙* @version 1.0* @since 2021-06-14 08:40*/@Mapperpublic interface UserMapper {/*** 添加用户信息** @param user 用户信息对象* @return 如果新增成功,则返回true;否则,返回false*/boolean save( User user);/*** 修改用户信息** @param user 用户信息对象* @return 如果修改成功,则返回true;否则,返回false*/boolean update( User user);/*** 删除用户信息** @param uuid 主键* @return 如果删除成功,则返回true;否则,返回false*/boolean delete(String uuid);/*** 根据主键查询用户信息** @param uuid 主键* @return 用户信息*/User get(String uuid);/*** 查询全部用户信息** @return 全部用户信息*/List<User> getAll();/*** 根据用户名和密码查询用户信息** @param username 用户名* @param password 密码* @return 用户信息*/User getByUsernameAndPassword(@Param("username") String username, @Param("password") String password);}
- com/xudaxian/mapper/UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.xudaxian.mapper.UserMapper"><insert id="save">INSERT INTO `user` (uuid, username, password, realName, gender, birthday)VALUES (#{uuid}, #{username}, #{password}, #{realName}, #{gender}, #{birthday})</insert><update id="update">UPDATE `user`SET username=#{username},password=#{password},realName=#{realName},gender=#{gender},birthday=#{birthday}WHERE uuid = #{uuid}</update><delete id="delete">DELETEFROM `user`WHERE uuid = #{uuid}</delete><select id="get" resultType="com.xudaxian.domain.User">SELECT *FROM `user`WHERE uuid = #{uuid}</select><select id="getAll" resultType="com.xudaxian.domain.User">SELECT *FROM `user`</select><select id="getByUsernameAndPassword" resultType="com.xudaxian.domain.User">SELECT *FROM `user`WHERE username = #{username}AND password = #{password}</select></mapper>
- jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/maven?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=truejdbc.username=rootjdbc.password=123456
- applicationContext-dao.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--开启bean注解扫描--><context:component-scan base-package="com.xudaxian"><context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/></context:component-scan><!--加载properties文件--><context:property-placeholder location="classpath*:jdbc.properties"/><!--数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!--整合mybatis到spring中--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="typeAliasesPackage" value="com.xudaxian.mapper"/><!--分页插件--><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><props><prop key="helperDialect">mysql</prop><prop key="reasonable">true</prop></props></property></bean></array></property></bean><!--映射扫描--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.xudaxian.mapper"/></bean></beans>
1.2.4 maven-ssm-service
- 目录结构:

- pom.xml
<?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">
<parent>
<artifactId>maven-ssm</artifactId>
<groupId>com.xudaxian</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-ssm-service</artifactId>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.xudaxian</groupId>
<artifactId>maven-ssm-dao</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- com.xudaxian.service.UserService.java
package com.xudaxian.service;
import com.github.pagehelper.PageInfo;
import com.xudaxian.domain.User;
/**
* @author 许大仙
* @version 1.0
* @since 2021-06-14 10:47
*/
public interface UserService {
/**
* 保存用户信息
*
* @param user 用户信息
* @return
*/
boolean save(User user);
/**
* 更新用户信息
*
* @param user 用户信息
* @return
*/
boolean update(User user);
/**
* 删除用户信息
*
* @param uuid 主键
* @return
*/
boolean delete(String uuid);
/**
* 根据主键获取用户信息
*
* @param uuid 主键
* @return
*/
User get(String uuid);
/**
* 分页显示用户信息
*
* @param page 页码
* @param size 每页显示条数
* @return
*/
PageInfo<User> getAll(int page, int size);
/**
* 根据用户名和密码登录
*
* @param userName
* @param password
* @return
*/
User login(String userName, String password);
}
- com.xudaxian.service.impl.UserServiceImpl.java
package com.xudaxian.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xudaxian.domain.User;
import com.xudaxian.mapper.UserMapper;
import com.xudaxian.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author 许大仙
* @version 1.0
* @since 2021-06-14 10:48
*/
@Transactional
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public boolean save(User user) {
return userMapper.save(user);
}
@Override
public boolean update(User user) {
return userMapper.update(user);
}
@Override
public boolean delete(String uuid) {
return userMapper.delete(uuid);
}
@Override
public User get(String uuid) {
return userMapper.get(uuid);
}
@Override
public PageInfo<User> getAll(int page, int size) {
PageHelper.startPage(page, size);
List<User> userList = userMapper.getAll();
return new PageInfo<>(userList);
}
@Override
public User login(String userName, String password) {
return userMapper.getByUsernameAndPassword(userName, password);
}
}
- applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--开启bean注解扫描-->
<context:component-scan base-package="com.xudaxian">
<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/>
</context:component-scan>
<!-- 导入applicationContext-dao.xml文件 -->
<import resource="classpath*:applicationContext-dao.xml"/>
<!--开启注解式事务-->
<tx:annotation-driven transaction-manager="txManager"/>
<!--事务管理器-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
</beans>
1.2.5 maven-ssm-web
- 目录结构:

- pom.xml
<?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">
<!-- 定义该工程的父工程 -->
<parent>
<artifactId>maven-ssm</artifactId>
<groupId>com.xudaxian</groupId>
<version>1.0</version>
<!-- 填写父工程的pom文件,如果是下面的这种格式,可以省略relativePath -->
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-ssm-web</artifactId>
<packaging>war</packaging>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.xudaxian</groupId>
<artifactId>maven-ssm-service</artifactId>
</dependency>
</dependencies>
<build>
<!--设置插件-->
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- com.xudaxian.utils.Code.java
package com.xudaxian.utils;
import java.io.Serializable;
/**
* @author 许大仙
* @version 1.0
* @since 2021-06-14 12:42
*/
public class Code implements Serializable {
// 操作结果编码
public static final Integer SAVE_OK = 20011;
public static final Integer UPDATE_OK = 20021;
public static final Integer DELETE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERROR = 20010;
public static final Integer UPDATE_ERROR = 20020;
public static final Integer DELETE_ERROR = 20030;
public static final Integer GET_ERROR = 20040;
// 系统错误编码
// 操作权限编码
// 校验结果编码
}
- com.xudaxian.utils.Result.java
package com.xudaxian.utils;
import java.io.Serializable;
/**
* @author 许大仙
* @version 1.0
* @since 2021-06-14 12:42
*/
public class Result implements Serializable {
// 操作结果编码
private Integer code;
// 操作数据结果
private Object data;
// 消息
private String message;
public Result(Integer code) {
this.code = code;
}
public Result(Integer code, Object data) {
this.code = code;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
@Override
public String toString() {
return "Result{" +
"code=" + code +
", data=" + data +
", message='" + message + '\'' +
'}';
}
}
- com.xudaxian.web.UserController.java
package com.xudaxian.web;
import com.github.pagehelper.PageInfo;
import com.xudaxian.domain.User;
import com.xudaxian.service.UserService;
import com.xudaxian.utils.Code;
import com.xudaxian.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
* @author 许大仙
* @version 1.0
* @since 2021-06-14 12:40
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public Result save(User user) {
boolean flag = userService.save(user);
return new Result(flag ? Code.SAVE_OK : Code.SAVE_ERROR);
}
@PutMapping
public Result update(User user) {
boolean flag = userService.update(user);
return new Result(flag ? Code.UPDATE_OK : Code.UPDATE_ERROR);
}
@DeleteMapping("/{uuid}")
public Result delete(@PathVariable String uuid) {
boolean flag = userService.delete(uuid);
return new Result(flag ? Code.DELETE_OK : Code.DELETE_ERROR);
}
@GetMapping("/{uuid}")
public Result get(@PathVariable String uuid) {
User user = userService.get(uuid);
return new Result(null != user ? Code.GET_OK : Code.GET_ERROR, user);
}
@GetMapping("/{page}/{size}")
public Result getAll(@PathVariable Integer page, @PathVariable Integer size) {
PageInfo<User> all = userService.getAll(page, size);
return new Result(null != all ? Code.GET_OK : Code.GET_ERROR, all);
}
@PostMapping("/login")
public Result login(String userName, String password) {
User user = userService.login(userName, password);
return new Result(null != user ? Code.GET_OK : Code.GET_ERROR, user);
}
}
- applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<context:component-scan base-package="com.xudaxian">
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/>
</context:component-scan>
<import resource="classpath*:applicationContext-service.xml"/>
</beans>
- spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.xudaxian.web">
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/>
</context:component-scan>
</beans>
- webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<!--启动服务器时,通过监听器加载spring运行环境-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
第二章:聚合和继承
2.1 聚合
- 聚合的作用:聚合用于快速构建 maven 工程,一次性构建多个项目/模块。
制作方式:
① 创建项目,打包类型定义为 pom 。
<!-- 定义该工程用于进行构建管理 --> <packaging>pom</packaging>② 定义当前项目进行构建操作时关联的其他模块名称:
<!-- 管理的工程列表 --> <modules> <!-- 具体的工程名称 --> <module>maven-ssm-pojo</module> <module>maven-ssm-dao</module> <module>maven-ssm-service</module> <module>maven-ssm-web</module> </modules>
注意事项:参与聚合操作的模块最终执行顺序和模块间的依赖关系有关,和配置顺序无关。
2.2 继承
- 继承的作用:通过继承可以实现在子工程中沿用父工程的配置。
制作方式:
① 在父工程中定义依赖管理。
<!-- 声明此处进行依赖管理 --> <dependencyManagement> <!-- 具体的依赖 --> <dependencies> <!-- 自定义工程依赖 --> <dependency> <groupId>com.xudaxian</groupId> <artifactId>maven-ssm-service</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.xudaxian</groupId> <artifactId>maven-ssm-pojo</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>com.xudaxian</groupId> <artifactId>maven-ssm-dao</artifactId> <version>1.0</version> </dependency> <!-- spring的环境 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- Spring整合Junit --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!-- mybatis的环境 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <!--mysql环境--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.25</version> </dependency> <!--spring整合jdbc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <!--spring整合mybatis--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.3</version> </dependency> <!--druid连接池--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <!--分页插件坐标--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.9.RELEASE</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.0</version> </dependency> </dependencies> </dependencyManagement>② 在子工程中声明其父工程坐标和对应的位置。
<!-- 定义该工程的父工程 --> <parent> <artifactId>maven-ssm</artifactId> <groupId>com.xudaxian</groupId> <version>1.0</version> <!-- 填写父工程的pom文件,如果是下面的这种格式,可以省略relativePath --> <relativePath>../pom.xml</relativePath> </parent>
- 继承的资源:
- groupId:项目组 ID ,项目坐标的核心因素。
- version:项目版本,项目坐标的核心因素。
- description:项目的描述信息。
- organization:项目的组织信息。
- inceptionYear:项目的创始年份。
- url:项目的URL地址。
- developers:项目的开发者信息。
- contributors:项目的贡献者信息。
- distributionManagement:项目的部署配置。
- issueManagement:项目的缺陷跟踪系统信息。
- CIManagement:项目的持续集成系统信息。
- scm:项目的版本控制系统。
- malilingLists:项目的邮件列表信息。
- properties:自定义的 Maven 属性。
- dependencies:项目的依赖配置。
- dependencyManagement:项目的依赖管理配置。
- repositories:项目的仓库配置。
- build:包括项目的源码目录配置i、输出目录配置、插件配置、插件管理配置等。
- reporting:包括项目的报告输出目录配置、报告插件配置等。
2.3 聚合和继承的异同点
- 作用:
- 聚合用于快速构建项目。
- 继承用于快速配置。
- 相同点:
- 聚合和继承的 pom.xml 文件打包方式均为 pom ,可以将两种关系制作到同一个 pom 文件中。
- 聚合和继承均属于设计型模块,并无实际的模块内容。
- 不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些。
- 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己。
第三章:属性
3.1 自定义属性
- 作用:等同于定义变量,方便统一维护。
- 定义格式:
<!-- 定义自定义属性 -->
<properties>
<spring.vresion>5.1.9.RELEASE</spring.vresion>
<mybatis.version>3.5.3</mybatis.version>
</properties>
- 调用格式:
<!-- 声明此处进行依赖管理 -->
<dependencyManagement>
<!-- 具体的依赖 -->
<dependencies>
<!-- spring的环境 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.vresion}</version>
</dependency>
<!-- mybatis的环境 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
3.2 内置属性
- 作用:使用 maven 内置属性,快速配置。
- 调用格式:
${basedir}
${version}
3.3 Settings 属性
- 作用:使用 maven 配置文件
settings.xml中的标签属性,用于动态配置。 - 调用格式:
${settings.localRepository}
3.4 Java 系统属性
- 作用:读取 Java 系统属性。
- 调用格式:
${user.home}
- 系统属性查询方式:
mvn help:system
3.5 环境变量属性
- 作用:使用 maven 配置文件
settings.xml中的标签属性,用于动态配置。 - 调用格式:
${env.JAVA_HOME}
- 环境变量属性查询方式:
mvn help:system
第四章:版本管理
4.1 工程版本
- SNAPSHOT(快照版本):
- 项目开发过程中,为方便团队成员合作,解决模块间依赖和即时更新的问题,开发者对于每个模块进行构建的时候,输出的临时性版本叫做快照版本(测试阶段版本)。
- 快照版本会随着开发的进展不断的更新。
- RELEASE(发布版本):
- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本对应的构建文件是稳定的,即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。
4.2 工程版本号的约定
- 约定规范:
<主版本>.<次版本>.<增量版本>.<里程碑版本>。- 主版本:表示项目重大架构的变更,如:
Spring5相较于Spring4的迭代。 - 次版本:表示有较大的功能增加和变化,或者全面系统地修复漏洞。
- 增量版本:表示有重大漏洞的修复。
- 里程碑版本:表示一个版本的里程碑(版本内部)。这样的版本同下一个正式版本相对,相对来说不是很稳定,有待更多的测试。
- 范例:
5.1.9.RELEASE。
第五章:资源配置
- 资源配置中的资源包括
properties文件、applicationContext.xml文件等。 资源配置其实就是将
properties、applicationContext.xml等文件中的信息配置到 Maven 中,由 Maven 统一管理,这样就可以在任意文件中加载 pom 文件中定义的属性了。示例:
- jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=123456
- pom.xml
<!-- 定义自定义属性 -->
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/maven?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true</jdbc.url>
</properties>
<build>
<pluginManagement>
<plugins>
<!--具体的插件配置-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>80</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!-- 配置资源文件对应的信息 -->
<resources>
<resource>
<!-- 设定配置文件对应的位置目录,支持使用属性动态设置路径 -->
<directory>${project.basedir}/src/main/resources</directory>
<!-- 开启对配置文件的资源加载过滤 -->
<filtering>true</filtering>
</resource>
</resources>
<!-- 配置测试资源文件对应的信息 -->
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
</build>
第六章:多环境开发配置
6.1 多环境开发

6.2 多环境配置
- pom.xml
<!-- 创建多环境 -->
<profiles>
<!-- 定义具体的环境:开发环境 -->
<profile>
<!-- 定义环境对应的唯一id -->
<id>dev_env</id>
<!-- 定义环境中专用的属性值 -->
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/maven?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true</jdbc.url>
</properties>
<!-- 设置默认启动 -->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 定义具体的环境:测试环境 -->
<profile>
<id>test_env</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/maven?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true</jdbc.url>
</properties>
</profile>
</profiles>
6.3 加载指定环境
- 作用:加载指定环境配置。
- 命令:
mvn 指令 -P 环境定义id
- 示例:
mvn install -P test_env
第七章:跳过测试
7.1 跳过测试环境的应用场景
- 整体模块功能未开发。
- 模块中某个功能未开发完毕。
- 单个功能更新调试导致其他功能失败。
- 快速打包。
- ……
7.2 跳过测试
7.2.1 使用命令跳过测试
- 命令:
mvn 指令 -D skipTests
注意事项:执行的指令生命周期必须包含测试环节。
- 示例:
mvn install -D skipTests
7.2.2 IDEA中使用界面跳过测试

7.2.3 使用配置跳过测试
- pom.xml
<build>
<!-- 使用配置跳过测试 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!-- 开启跳过测试 -->
<skipTests>true</skipTests>
<!-- 包含指定的测试用例 -->
<includes>
<include>**/User*Test.java</include>
</includes>
<!-- 排除指定的测试用例 -->
<excludes>
<exclude>**/User*TestCase.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
第八章:私服
8.1 Nexus
- Nexus 是 Sonatype 公司的一款 Maven 私服产品。
- 下载地址。
8.2 Nexus的安装、启动和配置
- 解压即可使用(系统为 win10 )。

- 启动服务器:
cd nexus-3.30.1-01
nexus.exe /run nexus
- 访问服务器(默认端口为 8081 ):
修改基础配置信息:安装路径下的 etc 目录中的
nexus-default.properties文件保存有 nexus 基础配置信息,例如:默认访问端口。修改服务器运行配置信息:安装路径下 bin 目录中的
nexus.vmoptions文件保存有 nexus 服务器启动的配置信息,例如:默认占用内存空间。
8.3 私服资源获取

8.4 仓库的分类
- 宿主仓库 hosted :保存无法从中央仓库获取的资源。
- 自主研发。
- 第三方非开源项目。
- 代理仓库 proxy :代理远程仓库,通过 nexus 访问其它公共仓库,例如:中央仓库。
- 仓库组 group :
- 将若干个仓库组成一个群组,简化配置。
- 仓库组不能保存资源,属于设计型仓库。
8.5 登录Nexus






8.5 创建仓库




8.6 将创建的仓库放入到 maven-public 仓库组中



8.7 手动上传组件




8.8 IDEA环境中资源上传和下载
8.8.1 概述

8.8.2 本地仓库访问私服
- 配置本地仓库访问私服的权限(settings.xml)
<servers>
<!-- 配置访问服务器的权限 -->
<server>
<id>xudaxian-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>xudaxian-release</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
- 配置本地仓库资源来源(settings.xml)
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<mirrorOf>central</mirrorOf>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
</mirror>
<!-- 配置本地仓库资源来源 -->
<mirror>
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<name>本地私服</name>
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
</mirrors>
8.8.3 IDEA 访问私服和组件上传
- 配置当前项目访问私服上传资源的保存位置(pom.xml)
<!-- 发布配置管理 -->
<distributionManagement>
<snapshotRepository>
<id>xudaxian-snapshots</id>
<url>http://localhost:8081/repository/xudaxian-snapshots/</url>
</snapshotRepository>
<repository>
<id>xudaxian-release</id>
<url>http://localhost:8081/repository/xudaxian-release/</url>
</repository>
</distributionManagement>
- 发布资源到私服的命令:
mvn deploy
