今天记录一下maven的基本使用-创建多模块项目, 各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
直接上步骤:
创建继承关系模块(两个模块具有父子关系)
创建父子模块
第一步:创建父模块
依次点击 File -> New -> Project ->Maven ->Next
按自己需求填写如下信息,最后点击Finish完成父模块的创建。
创建后目录结构如下:
第二步:修改父模块pom
在修改pom文件之前,先删掉父模块中的src目录。
然后在修改pom文件,如果只是简单能用,其实只要修改如下两个配置即可:
1、添加标签并将其改为pom。
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.yjh.learn</groupId>
<artifactId>pro-learn</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>
<!-- 子模块 -->
<modules>
<module>redis-learn</module>
<module>pro-common</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!-- 使用dependencyManagement标签配置对所有模块依赖的管理 -->
<dependencyManagement>
<dependencies>
<!-- spring-boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<!-- spring redis 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.3.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
我们在父模块中引入了三个依赖,接下来我们创建一个学习redis的子模块。
创建子模块
第一步:创建子模块
选中父工程 pro-learn -> New -> Module -> Spring Initializr -> Module SDK(选择自己的jdk版本) -> Next
按自己需求填写如下信息,点击Next进入下一步。
这里可以什么都不选,点击Next进入下一步,然后,按自己需求填写信息,最后点击Finish完成子模块的创建。
创建子模块后的目录结构如下:
这里我把用不到的文件和目录(.mvn、HELP.md、mvnw、mvnw.cmd)删掉,至于这几个文件的作用是什么,自行百度,删除后如下,看着清爽多了:
第二步:父模块中添加modules管理子模块
在父pom中添加如下配置:
<modules>
<module>redis-learn</module>
</modules>
第三步:配置子模块pom
将redis-learn模块pom文件中parent中的坐标(groupId、artifactId、version)改为父模块的坐标,及添加依赖,具体看以下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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
<!-- 父工程的坐标 -->
<groupId>com.yjh.learn</groupId>
<artifactId>pro-learn</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,可以省略 -->
<groupId>com.yjh.learn</groupId>
<artifactId>redis-learn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>redis-learn</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。 -->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
此时我们查看下子模块maven的依赖包,发现版本同父模块,如下:
当然你也可以像创建父模块一样来创建子模块,这样就不用自己在父模块的modules中自己添加配置,会自动添加,但是响应的src目录下也没有SpringBoot的启动类及resources文件夹,根据自己习惯来就行。
创建依赖关系模块(一个模块引用另一个模块)
在我们开发中,是不是经常把一些公用的方法,比如你的util工具类,常量类等放到一个单独的包中,比如放到common包中,如果分多模块,就可以把这些公共方法单独放到一个模块中。
创建子模块
第一步:创建子模块
像上面创建redis-learn模块一样,创建一个子模块pro-common用来存放公共类。
如下,我们在pro-common模块中添加了一个TaskIdUtil的工具来,这个类是我项目中用来按客户id按天生成自增序列号的,格式为 yyMMdd + 4位账号序列号 + 8位自增,当达到最大值999999999时从00000001开始自增,TaskIdUtil类代码如下:
package com.yjh.learn.procommon.utils;
import com.yjh.learn.procommon.cache.CacheCurrentDate;
import java.text.NumberFormat;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author yjh
*/
public class TaskIdUtil {
private static final Integer MAX_VALUE = 99999999;
private static AtomicInteger num = new AtomicInteger(0);
/**
* yyMMdd + 4位账号序列号 + 8位自增
*
* @param accountId 账号id
* @return
*/
public static String getTaskId(String accountId) {
StringBuffer buffer = new StringBuffer();
String nowDateStr = CacheCurrentDate.INS.nowDateStr();
String accSeqnceNo = accFormat(accountId);
String sequenceNo = getSequenceNo();
return buffer.append(nowDateStr).append(accSeqnceNo).append(sequenceNo).toString();
}
private static String getSequenceNo() {
int initNum = num.get();
if (initNum == MAX_VALUE) {
num = new AtomicInteger(1);
return numFormat(1);
}
int result = num.incrementAndGet();
return numFormat(result);
}
private static String numFormat(int number) {
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(false);
format.setMaximumIntegerDigits(8);
format.setMinimumIntegerDigits(8);
String result = format.format(number);
return result;
}
private static String accFormat(String accountId) {
NumberFormat format = NumberFormat.getInstance();
format.setGroupingUsed(false);
format.setMaximumIntegerDigits(4);
format.setMinimumIntegerDigits(4);
String result = format.format(Integer.parseInt(accountId));
return result;
}
}
第二步:在redis-learn引用pro-common
修改redis-learn模块中的pom文件,通过pro-common的坐标来引用pro-common模块,在redis-learn的pom中添加如下配置:
<dependency>
<groupId>com.yjh.learn</groupId>
<artifactId>pro-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
这是我们刷新maven依赖可以看到pro-common已经引入我们的redis-learn模块中了,如下:
第三步:测试依赖是否可用
在redis-learn模块中的测试类中添加如下测试方法:
@Test
void contextLoads() {
for (int i = 0; i < 20; i++) {
System.out.println(TaskIdUtil.getTaskId("1"));
}
}
发现可以正确引用pro-common模块的工具来并执行成功,执行结果如下:
至此,一个基本的maven管理的多模块项目就搭建完毕了。