在 IntelliJ IDEA 中创建基本的 Maven 多模块项目
笔者的环境:
- Maven 3.6.3
- JDK 11
- IntelliJ IDEA 2020.2.2 (Ultimate Edition)
创建 Maven 的多模块项目的好处有很多,比方说,可以非侵入式地使用其它工程中的模块、隔离同一个包中不同的类等。这里假设要创建的多模块项目不是 Web 项目,而是普通的 Java 项目。这里要创建的是一个 MVC 多模块项目,方法如下。
-
在继续阅读本教程之前,需要先完成 Maven 的安装。关于 Maven 的安装,请见笔者的另一篇博客:
Maven 的下载安装教程:
https://blog.csdn.net/wangpaiblog/article/details/112689500 -
创建一个 Maven 项目,这个项目将作为多模块中的父模块。
-
创建好之后,应该可以看下如下的 pom 文件。
-
创建子模块。注意,在创建子模块时要选择父模块,同时正确指定子模块的路径。Maven 约定,默认为子模块路径为父模块的下一级。建议遵循 Maven 这个默认设定。
-
创建其它的子模块。
【小贴士】
如果在创建模块时使用合适的 Maven 原型,可以减少创建时的一些步骤。只是要注意,需要在使用 Maven 原型输入一些变量来避免 IntelliJ IDEA 长时间下载此 Maven 原型。而之所以这里没有选择在父模块中使用 Maven 原型,是因为父模块不需要做太多的事情。步骤如下:
-
如图。
-
在快要完成 Maven 模块创建时,在图中的 Properties 中添加键值对
Name-Value
:-
Name
: archetypeCatalogValue
: internal
-
-
如果不添加此键值对,IntelliJ IDEA 将会从 Maven 中央仓库去获取上面选择的 archetype。有过完整安装 Maven 的读者可能知道,这个过程可以十分缓慢。而添加此键值对之后,则获取该 archetype 的方式将变为内部获取,而使用这种方式构建项目的速度将大大提高。
-
-
父模块一般只是用于聚合子模块,它本身可以没有实际的 Java 代码。如果不需要在父模块中编写 Java 源代码,则父模块中的文件夹 src 可以删去。
-
Maven 规定,聚合模块的
<packaging/...>
要设置为 pom,同时作为父模块,应该在父模块的 pom 文件中写明它的子模块。(注意:在 Maven 中,聚合模块与父模块本质上是完全不同的、互相独立的概念。但为了减少麻烦,一般会让聚合模块也同时是父模块。)
-
另外,在设置完之后,IntelliJ IDEA 右侧应该会显示相应的各模块。
-
为了便于各模块之间的互相依赖,应该在父模块中设置这些依赖。
(注意:在父模块中,应该使用
<dependencyManagement/...>
,而不要直接使用<dependencies/...>
。因为直接使用<dependencies/...>
会让子模块引入不必要的依赖。编程的一个原则就是,不要做多余的事情。要记住,冗余代码就是地雷。如果不希望日后的开发成为灾难,那最好不要偷懒。)
-
现在,Maven 的多模块项目的骨架已经搭成。各模块中的文件夹 Java 即为 Java 源代码目录。
-
各模块的 pom 文件示例代码如下。
-
父模块 mvc 的 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>org.genius.mvc</groupId> <artifactId>mvc</artifactId> <version>1.0</version> <packaging>pom</packaging> <name>mvc</name> <modules> <module>model</module> <module>view</module> <module>service</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project_version>1.0</project_version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.genius.mvc</groupId> <artifactId>model</artifactId> <version>${project_version}</version> </dependency> <dependency> <groupId>org.genius.mvc</groupId> <artifactId>view</artifactId> <version>${project_version}</version> </dependency> <dependency> <groupId>org.genius.mvc</groupId> <artifactId>service</artifactId> <version>${project_version}</version> </dependency> </dependencies> </dependencyManagement> </project>
-
子模块 model 的 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> <parent> <artifactId>mvc</artifactId> <groupId>org.genius.mvc</groupId> <version>1.0</version> </parent> <artifactId>model</artifactId> <name>model</name> </project>
-
子模块 view 的 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> <parent> <artifactId>mvc</artifactId> <groupId>org.genius.mvc</groupId> <version>1.0</version> </parent> <artifactId>view</artifactId> <name>view</name> </project>
-
子模块 controller 的 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> <parent> <artifactId>mvc</artifactId> <groupId>org.genius.mvc</groupId> <version>1.0</version> </parent> <artifactId>controller</artifactId> <name>controller</name> </project>
-