IDEA如何创建多个模块Maven SpringBoot项目
创建模块
一、在界面左上角选择File->New->Project后,选择Spring Initializr,默认使用的Java版本是1.8。
二、点击Next,进入下一步,可以设置项目的一些基本信息。
groupId和artifactId统称为“坐标”,是为了保证项目唯一性而提出的。groupId是项目组织唯一的标识符,实际对应JAVA的包的结构,ArtifactID是项目的唯一的标识符,实际对应项目的名称,就是项目根目录的名称。groupId一般分为多个段,一般第一段为域,第二段为公司名称。举个apache公司的tomcat项目例子:这个项目的groupId是org.apache,它的域是org,公司名称是apache,artifactId是tomcat。包结构package最好是以groupId.artifactId打头的。
三、点击Next,进入下一个选择dependency的界面,作用是在pom中自动添加一些依赖,在项目开始时就下载。这里我们暂时不勾选任何依赖。
四、点击Next,进入下一个界面,填写工程名,并选择工程所在目录。填写完成后,点击Finish,即可创建一个spring boot项目。
新建完成父工程之后将多余的文件和文件夹删除,删除前与删除后的结构如下(忘记截图,网络图片如下,参考文章地址:https://jingyan.baidu.com/article/e2284b2ba1602fe2e7118d77.html):
创建子模块
在上面创建好的many-parent-demo工程名上,点击右键,选择New–>Module,进入New Module页面。
该模块的名字安照自己的需要自行填写(eg:我这是当做公共模块,就叫common-demo),后面其他的参数都可参照父模块的参数设置。
按照上述步骤,可以按照自己的需要,创建多个子模块
一些公共模块common、core等,不需要启动类的,可以把启动类删除。
多模块项目配置
父模块配置
父pom是为了抽取统一的配置信息和依赖版本控制,方便子pom直接引用,简化子pom的配置。
下面介绍下父pom的配置中需要注意的一些地方。我贴出的pom看起来会有点冗余,因为其中一些不需要的地方,我没有直接删掉而是注释掉,并加了说明,是为了后续查看的时候还能清楚删掉的原因。
1、父模块的打包类型
多模块项目中,父模块打包类型必须是pom,同时以给出所有的子模块,其中每个module,都是另外一个maven项目。 后续新增的子模块也必须加到父pom的modules中。
2、继承设置
继承是maven中很强大的一种功能,继承可以使子pom获得parent中的各项配置,对子pom进行统一的配置和依赖管理。父pom中的大多数元素都能被子pom继承,想深入了解的同学可自行搜索学习~~
3、使用dependencyManagement管理依赖版本号
一般在项目最顶层的父pom中使用该元素,让所有子模块引用一个依赖而不用显式的列出版本号。maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用在这个dependencyManagement元素中指定的版本号。
4、使用properties控制依赖包的版本号,便于版本维护
在properties标签中,添加各依赖包的版本号,然后在dependency中直接引用该依赖版本号的值即可。
父模块的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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 父模块打包类型必须为pom -->
<modules>
<module>common-demo</module>
<module>core-demo</module>
<module>consumer-demo</module>
<module>provider-demo</module>
</modules>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- <dependency>
<groupId></groupId>
<artifactId></artifactId>
</dependency>-->
</dependencies>
</dependencyManagement>
<!-- <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>-->
<!-- 该插件作用是打一个可运行的包,必须要写在需要打包的项目里。这里的父模块不需要打包运行,所以删除该插件 -->
<!-- <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
</project>
common模块的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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>--> <!-- lookup parent from repository -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>common-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>common-demo</name>
<description>Demo project for Spring Boot</description>
<!-- properties可删掉,会继承父模块的 -->
<!-- <properties>
<java.version>1.8</java.version>
</properties>-->
<dependencies>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>-->
</dependencies>
<!-- <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
</project>
core模块的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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>--> <!-- lookup parent from repository -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>core-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>core-demo</name>
<description>Demo project for Spring Boot</description>
<!-- properties可删掉,会继承父模块的 -->
<!-- <properties>
<java.version>1.8</java.version>
</properties>-->
<dependencies>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>-->
<!-- Common 应用公共模块common-->
<dependency>
<groupId>com.example</groupId>
<artifactId>common-demo</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<!-- <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>-->
</project>
consumer模块的项目文件:
<?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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
<relativePath/>--> <!-- lookup parent from repository -->
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.example</groupId>
<artifactId>consumer-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>consumer-demo</name>
<description>Demo project for Spring Boot</description>
<!-- properties可删掉,会继承父模块的 -->
<!-- <properties>
<java.version>1.8</java.version>
</properties>-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Common 应用公共模块common-->
<dependency>
<groupId>com.example</groupId>
<artifactId>common-demo</artifactId>
<version>${project.parent.version}</version>
</dependency>
<!-- Core 应用公共模块common-->
<dependency>
<groupId>com.example</groupId>
<artifactId>core-demo</artifactId>
<version>${project.parent.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<!-- 该配置使打成的war,不带版本号,直接是consumer-demo.war -->
<finalName>consumer-demo</finalName>
</build>
</project>
provider模块的配置大致同consumer,这里不再粘贴
参考文档地址:https://www.cnblogs.com/huanghongbo/p/9098588.html
打包时可能出现的错误:
Maven中出现Could not find artifact …:pom:0.0.1-SNAPSHOT。。
多模块项目构建时,先将总项目install,之后子项目分别install,注意他们的依赖关系。
比如dao的运行需要依赖domain,service的运行需要依赖dao,web的运行需要依赖service,所以先insall总项目,在install domain,然后dao,service,web。
如果总项目install时就出现问题,就先从子项目开始,最后弄总项目即可。
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.666 s <<< FAILURE! - in com.exampl…
test目录打包出错:
简单粗暴的解决方法是,直接删掉,相关的测试类
另外一种就是:
不用上述方式编译打包,改用命令行方式跳过Test,命令如下:
mvn clean package -DskipTests 这样maven就不会进行Test相关的编译了。
另外:创建的测试项目,上传至资源里