一、Maven插件
1.1、jdk1.8
编译插件jdk1.8
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>
二、pom.xml中的标签
pom.xml中<scope>
关于maven依赖中的scope的作用和用法:https://blog.csdn.net/qq_36874292/article/details/81072717
compile(默认):compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。默认的scope,在部署的时候将会打包到lib目录下,项目在编译测试运行阶段都需要
test:表示依赖项目仅仅参与测试相关的工作,在编译和运行环境下都不会被使用,更别说打包了
provided:适合在编译和测试的环境,他和compile很接近,但是provide仅仅需要在编译和测试阶段,同样provide将不会被打包到lib目录下。
Pom.xml中相关标签
上传到nexus私服
<!-- 使用分发管理将本项目打成jar包,直接上传到指定服务器 --> <distributionManagement> <!--正式版本--> <repository> <!-- nexus服务器中用户名:在settings.xml中<server>的id--> <id>yang</id> <!-- 这个名称自己定义 --> <name>Release repository</name> <url>http://192.168.1.105:8081/repository/yang/</url> </repository> <!--快照 <snapshotRepository> <id>nexus-snapshots</id> <name>Snapshots repository</name> <url>http://192.168.1.105/repository/yang/</url> </snapshotRepository>--> </distributionManagement>
< repository >节点下的< id >对应setting.xml文件中的server的id 在settings.xml中设置对应的登录用户名与密码: <!--maven连接nexus需要验证用户名和密码--> <server> <id>yang</id> <username>admin</username> <password>admin123</password> </server>
注意点:上传正式版本,pom.xml文件version中不能有SNAPSHOT,快照版本才有。
如:
<groupId>com.yang</groupId> <artifactId>shade-plugin</artifactId> <version>0.0.1</version>
三、Maven多模块开发
3.1、Pom.xml多模块结构
Maven配置文件:
<?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> <!-- 设置父模块 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.10.RELEASE</version> <relativePath /> </parent> <!-- 定义本项目的工程坐标 --> <groupId>com.changlu</groupId> <artifactId>springboot-mall</artifactId> <version>1.0.0</version> <!-- 工程中仅有一个pom.xml时需要声明,表示其是一个管理包 --> <packaging>pom</packaging> <!-- 声明子模块 --> <modules> <module>mall-admin</module> <module>mall-common</module> <module>mall-controller</module> <module>mall-service</module> <module>mall-admin</module> </modules> <!-- 定义版本 --> <properties> <java.version>1.8</java.version> <mybatis-plus.version>3.4.0</mybatis-plus.version> </properties> <!-- 设置依赖 --> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> </dependencies> </project>
modules:管理模块。
parent:定义父模块。
properties:定义属性名,用于进行版本管理。
3.2、聚合与继承的关系
1、聚合主要是为了方便快速构建项目,继承主要是为了消除重复配置
2、对于聚合模块而言,它知道有哪些被聚合的模块,但那些被聚合的模块不知道这个聚合模块的存在;对于继承的父pom 而言,它不知道有哪些子模块继承它,但那些子模块都必须知道自己的父pom 是什么
3、聚合pom 与继承中的父pom 的 packaging 都必须是 pom;同时,聚合模块与继承中的父模块除了 pom 外,都没有实际的内容。
3.3、多模块实操
3.3.1、pom.xml介绍
在子模块中最好都不要出现版本,统一由父工程来进行管理版本。
其中oa-web、oa-admin为web工程,其他都是可以进行复用的公共模块。
对于公共模块,直接新建普通的maven工程,选择moduleexer作为父工程即可!
moduleexer为父模块,用于统一管理内部的模块,首先介绍moduleexer工程中的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 模块管理 --> <modules> <module>oa-common</module> <module>oa-dao</module> <module>oa-common</module> <module>oa-service</module> <module>oa-web</module> <module>oa-admin</module> <module>oa-model</module> </modules> <!-- 将其作为父模块 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.changlu</groupId> <artifactId>moduleexer</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- 聚合模块父模块务必设置packaging为pom,默认jar会打成一个jar包 --> <packaging>pom</packaging> <!-- 自定义属性,统一进行版本管理 --> <properties> <oa-version>0.0.1-SNAPSHOT</oa-version> <mybatis-spring-starter-version>2.1.2</mybatis-spring-starter-version> <mysql-connector-version>8.0.23</mysql-connector-version> </properties> <!-- 父工程统一进行版本管理 --> <dependencyManagement> <dependencies> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-model</artifactId> <version>${oa-version}</version> </dependency> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-dao</artifactId> <version>${oa-version}</version> </dependency> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-service</artifactId> <version>${oa-version}</version> </dependency> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-common</artifactId> <version>${oa-version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-spring-starter-version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-version}</version> </dependency> </dependencies> </dependencyManagement> </project>
外部父模块中不需要引入依赖,可以进行依赖版本的管理,其子模块在添加依赖时只要是父模块管理的就可以不用写版本,由父模块来同一进行控制!
接下来我们啦看看对应的公共模块各自的pom.xml:
oa-dao:用于编写公共dao,可以看到其父模块为moduleexer,引入的依赖并没有进行设置版本,由父模块来进行管理!
引入公共模块:oa-common、oa-model <?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>moduleexer</artifactId> <groupId>com.changlu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>oa-dao</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-model</artifactId> </dependency> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-common</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*/xml</include> </includes> </resource> <resource> <directory>src/main/resources</directory> </resource> </resources> </build> </project>
oa-model:在模型层,我们仅仅只需要引入指定的插件依赖即可
<?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>moduleexer</artifactId> <groupId>com.changlu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>oa-model</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies> </project>
oa-service:用于编写service层
引入公共模块:oa-dao,由于oa-dao已经引入oa-model,所以不需要重复引入。 ... <dependencies> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-dao</artifactId> </dependency> </dependencies> ...
接下来就是web模块了:oa-web,在这里我们就需要引入spring-boot-starter-web模块了
引入公共模块:oa-service,只需要引入其一个模块即可,其他模块也都被间接引入了! 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>moduleexer</artifactId> <groupId>com.changlu</groupId> <version>0.0.1-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>oa-web</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- 引入web模块 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.changlu</groupId> <artifactId>oa-service</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!--用于明确表示编译版本配置有效--> <fork>true</fork> </configuration> </plugin> </plugins> </build> </project>
此时我们就已经把大致内容介绍完了,对于oa-common与oa-admin(后台web模块)就不再展示了。
3.3.2、多模块运行测试
sql语句:创建与插入用户表
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL COMMENT 'id', `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名', `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES (1, 'changlu', '123456'); INSERT INTO `user` VALUES (2, 'liner', '456789');
@Data @AllArgsConstructor @NoArgsConstructor public class User { private Integer id; private String username; private String password; }
//UserMapper @Mapper public interface UserMapper { /** * 查询所有用户 * @return 用户集合 */ List<User> queryUserList(); } //UserMapper.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 设置指定的namespace --> <mapper namespace="com.changlu.mapper.UserMapper"> <!-- 根据username获取User对象 --> <select id="queryUserList" resultType="User"> select * from user </select> </mapper>
public interface IUserService { List<User> queryUserList(); } @Service public class UserServiceImpl implements IUserService { @Resource private UserMapper userMapper; @Override public List<User> queryUserList() { return userMapper.queryUserList(); } }
@RestController public class UserController { @Autowired private IUserService userService; @GetMapping("/user") public List<User> userList(){ return userService.queryUserList(); } }
server:
port: 8088
# 配置mybatis数据源 spring: datasource: url: jdbc:mysql://localhost:3306/test?setTimezone=UTC&useUnicode=true&characterEncoding=utf-8 username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver # 整合mybatis,实体类包配置和mapper映射地址 mybatis: type-aliases-package: com.changlu.entity mapper-locations: classpath:mapper/*.xml
此时我们来启动springboot,即oa-web工程,接着使用postman来进行测试:
测试成功。总结一下吧,使用maven多模块能够更加方便的进行模块复用与解耦,例如管理后台,前台以及app这类web工程就能够很好的复用model以及common模块了,并且我们也能够更好的进行版本的管理!
四、deploy module
参考文章:Maven聚合项目deploy指定module