今天记录一下maven的基本使用-创建多模块项目, 各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!

直接上步骤:

创建继承关系模块(两个模块具有父子关系)

创建父子模块

第一步:创建父模块

依次点击 File -> New -> Project ->Maven ->Next

idea java多模块项目怎么部署 idea多模块引用pom配置_maven

idea java多模块项目怎么部署 idea多模块引用pom配置_idea java多模块项目怎么部署_02

按自己需求填写如下信息,最后点击Finish完成父模块的创建。

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_03

创建后目录结构如下:

idea java多模块项目怎么部署 idea多模块引用pom配置_maven_04

第二步:修改父模块pom

在修改pom文件之前,先删掉父模块中的src目录。

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_05

然后在修改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

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_06

idea java多模块项目怎么部署 idea多模块引用pom配置_spring_07

按自己需求填写如下信息,点击Next进入下一步。

idea java多模块项目怎么部署 idea多模块引用pom配置_idea java多模块项目怎么部署_08

这里可以什么都不选,点击Next进入下一步,然后,按自己需求填写信息,最后点击Finish完成子模块的创建。

idea java多模块项目怎么部署 idea多模块引用pom配置_maven_09

idea java多模块项目怎么部署 idea多模块引用pom配置_spring_10

创建子模块后的目录结构如下:

idea java多模块项目怎么部署 idea多模块引用pom配置_maven_11

这里我把用不到的文件和目录(.mvn、HELP.md、mvnw、mvnw.cmd)删掉,至于这几个文件的作用是什么,自行百度,删除后如下,看着清爽多了:

idea java多模块项目怎么部署 idea多模块引用pom配置_maven_12

第二步:父模块中添加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的依赖包,发现版本同父模块,如下:

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_13

当然你也可以像创建父模块一样来创建子模块,这样就不用自己在父模块的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模块中了,如下:

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_14

第三步:测试依赖是否可用

在redis-learn模块中的测试类中添加如下测试方法:

@Test
void contextLoads() {
    for (int i = 0; i < 20; i++) {
        System.out.println(TaskIdUtil.getTaskId("1"));
    }
}

发现可以正确引用pro-common模块的工具来并执行成功,执行结果如下:

idea java多模块项目怎么部署 idea多模块引用pom配置_redis_15

至此,一个基本的maven管理的多模块项目就搭建完毕了。