使用idea搭建maven多模块工程
- 一、简介
- 二、搭建一个多模块工程
- 1、idea创建maven工程
- 2、创建子级模块
- 3、多模块间设置依赖、调用关系
- 4、 几个注意事项:
- 1、项目中所有的groupId要一样
- 2、packaging标签配置有讲究
- 1、配置为pom
- 2、配置为jar
- 3、配置为war
- 5、文件展示
- 1、 introduction的pom.xml文件展示
- 2、 food的pom.xml文件展示
- 3、 population的pom.xml文件展示
- 4、 region的pom.xml文件展示
- 5、 season的pom.xml文件展示
- 6、 west的pom.xml文件展示
- 7、 east的pom.xml文件展示
- 6、 编译结果展示
- 7、maven常用生命周期
- 1、maven clean:
- 2、maven package:
- 3、maven install:
- 4、maven compile:
一、简介
大公司里经常会处理一些复杂的业务,如果搭建分散的几个项目,之间的调用可能需要用http请求,不仅效率低,部署也是件头疼的事情。这里推荐使用maven多模块架构,它经常用在比较大的项目中,可以按照业务模块分,也可以按照层次分模块,代码的可读性和可维护性都比较好。maven提供了非常丰富的标签和插件,idea工具更是把搭建maven多模块工程做得很简便。
二、搭建一个多模块工程
以下方的项目为例,项目结构为:
1、idea创建maven工程
- Maven Project可以理解为一个单独、独立的工程,在打包为jar或者war时,可以单独运行。如果在pom文件中添加了对父工程的依赖,此时作为父工程的子工程。*
创建一个工程叫做国家介绍:
至此工程框架已经搭建好了。
2、创建子级模块
** Maven Module也是一个maven 工程,但是却是一个子工程,必须有父工程存在并依赖,Maven Module不能抛弃父工程单独存在。**
在工程名上右键,new->Module
点击Finish,工程里的season模块便新建好了,且其父模块为introduction
按照上述方法,再创建food、pupulation、region等模块,在region模块中,创建west和east模块,完成后的工程如下(我改了工程名,叫practice):
自此,围绕文章上方的架构目标,已经搭建好工程。
3、多模块间设置依赖、调用关系
子模块中的maven是相互独立的,打包时也只会包含本module的包。但是在实际的应用中,多个模块肯定是有调用关系的,要不然也无需放在同一个工程里。多模块的一个特点便是单向调用。
依赖关系如下:
food、population、region、season作为introduction的子模块;
population模块需要调用food模块;
region模块需要调用population、food模块;
region的子模块包括west、east;
4、 几个注意事项:
1、项目中所有的groupId要一样
<groupId>com.hm.country</groupId>
2、packaging标签配置有讲究
目前packaging标签有3种配置:
<packaging>pom</packaging>
<packaging>jar</packaging>
<packaging>war</packaging>
1、配置为pom
在父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件将多个子模块合并,用于聚合,无java代码,在maven install时不会生成jar/war压缩包。
在introducion模块的pom.xml中:
<packaging>pom</packaging>
2、配置为jar
Jar包是最为常见的打包方式,当pom文件中没有设置packaging参数时,默认使用jar方式打包。
这种打包方式意味着在maven build时会将这个项目中的所有java文件都进行编译形成.class文件,且按照原来的java文件层级结构放置,最终压缩为一个jar文件,生成在与src平级的target目录下。
在food模块的pom.xml中:
<packaging>jar</packaging>
3、配置为war
war包与jar包非常相似,不同的是,它会将项目中依赖的所有jar包都放在WEB-INF/lib这个文件夹下。
5、文件展示
1、 introduction的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<name>introduction</name>
<groupId>com.hm.country</groupId>
<artifactId>introduction</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>population</module>
<module>season</module>
<module>region</module>
<module>food</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>population</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>season</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>region</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>food</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<finalName>hmcountry</finalName>
</build>
</project>
2、 food的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>introduction</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<name>food</name>
<!--<groupId>com.hm.country</groupId>-->
<artifactId>food</artifactId>
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、 population的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>introduction</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<version>1.0-SNAPSHOT</version>
<modelVersion>4.0.0</modelVersion>
<name>population</name>
<groupId>com.hm.country</groupId>
<artifactId>population</artifactId>
<packaging>jar</packaging>
<!-- population模块要调用food模块 -->
<dependencies>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>food</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
4、 region的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>introduction</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<name>region</name>
<version>1.0-SNAPSHOT</version>
<groupId>com.hm.country</groupId>
<artifactId>region</artifactId>
<modules>
<module>east</module>
<module>west</module>
</modules>
<dependencies>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>food</artifactId>
</dependency>
<dependency>
<groupId>com.hm.country</groupId>
<artifactId>population</artifactId>
</dependency>
</dependencies>
</project>
5、 season的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>introduction</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>season</name>
<groupId>com.hm.country</groupId>
<artifactId>season</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
</project>
6、 west的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>region</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>west</name>
<artifactId>west</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<finalName>mypractice</finalName>
</build>
</project>
7、 east的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>region</artifactId>
<groupId>com.hm.country</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>east</name>
<artifactId>east</artifactId>
<packaging>jar</packaging>
<build>
<plugins>
<!-- define the project compile level -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
<finalName>mypractice</finalName>
</build>
</project>
6、 编译结果展示
在idea右侧有个MavenProjects,点开后能看到各个模块,可以对单个模块进行编译,也可以对整个项目进行编译。当pom.xml改动后,及时Import Changes,或者是按截图里左上角的刷新符号,很多时候报包找不到就是因为没有重新引入。
首先clean一下:
点击compile,编译成功,在日志里根据每个模块的顺序能看出模块之间的关系。
7、maven常用生命周期
1、maven clean:
clean会清除target目录。
2、maven package:
打包,把jar打到本项目的target下,maven仓库中还是老的jar。
3、maven install:
install除了打包以外,还把target下的jar安装到本地仓库,供其他项目使用。执行install,其实是执行了validate、compile、test、package、verify、install这么多操作,所以不用先clean。
4、maven compile:
如果我们不需要jar,而且所更改代码不需要被引用,那么只需要compile即可。
本文中可能有一些不对的地方,欢迎各位指出。
参考博客:
链接: maven之packaging标签.
链接: IntelliJ IDEA打开多个Maven的module且相互调用代码.
链接: Maven - 快速创建Java工程和Web工程 链接: 【Maven】使用Maven构建多模块项目(经典)