使用idea搭建maven多模块工程
一、简介
大公司里经常会处理一些复杂的业务,如果搭建分散的几个项目,之间的调用可能需要用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