使用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多模块工程做得很简便。

二、搭建一个多模块工程

以下方的项目为例,项目结构为:

maven多模块部署服务器 maven多模块项目搭建_apache

1、idea创建maven工程

  • Maven Project可以理解为一个单独、独立的工程,在打包为jar或者war时,可以单独运行。如果在pom文件中添加了对父工程的依赖,此时作为父工程的子工程。*

创建一个工程叫做国家介绍:

maven多模块部署服务器 maven多模块项目搭建_apache_02


maven多模块部署服务器 maven多模块项目搭建_maven多模块部署服务器_03


maven多模块部署服务器 maven多模块项目搭建_xml_04


maven多模块部署服务器 maven多模块项目搭建_maven多模块部署服务器_05


maven多模块部署服务器 maven多模块项目搭建_java_06


至此工程框架已经搭建好了。

2、创建子级模块

** Maven Module也是一个maven 工程,但是却是一个子工程,必须有父工程存在并依赖,Maven Module不能抛弃父工程单独存在。**

在工程名上右键,new->Module

maven多模块部署服务器 maven多模块项目搭建_maven多模块部署服务器_07


maven多模块部署服务器 maven多模块项目搭建_maven_08


maven多模块部署服务器 maven多模块项目搭建_xml_09


maven多模块部署服务器 maven多模块项目搭建_apache_10


点击Finish,工程里的season模块便新建好了,且其父模块为introduction

maven多模块部署服务器 maven多模块项目搭建_maven_11


按照上述方法,再创建food、pupulation、region等模块,在region模块中,创建west和east模块,完成后的工程如下(我改了工程名,叫practice):

maven多模块部署服务器 maven多模块项目搭建_java_12


自此,围绕文章上方的架构目标,已经搭建好工程。

3、多模块间设置依赖、调用关系

子模块中的maven是相互独立的,打包时也只会包含本module的包。但是在实际的应用中,多个模块肯定是有调用关系的,要不然也无需放在同一个工程里。多模块的一个特点便是单向调用。

依赖关系如下:

maven多模块部署服务器 maven多模块项目搭建_apache_13


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一下:

maven多模块部署服务器 maven多模块项目搭建_apache_14


点击compile,编译成功,在日志里根据每个模块的顺序能看出模块之间的关系。

maven多模块部署服务器 maven多模块项目搭建_java_15

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构建多模块项目(经典)