概述
modules标签用于父项目构建子模块。使用多模块的Maven配置,可以帮助项目划分模块,整体项目结构更清晰。
earth项目目录如下:
父项目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>
<groupId>ymqx.com</groupId>
<artifactId>earth</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>dao</module>
<module>facade</module>
<module>portal</module>
<module>service</module>
</modules>
<properties>
<!-- 依赖包版本号 -->
<fasterxml.version>2.11.1</fasterxml.version>
<slf4j.version>1.7.30</slf4j.version>
<mybatis-plus.version>3.3.0</mybatis-plus.version>
<lombok.version>1.18.8</lombok.version>
<!-- 第三方插件版本号 -->
<!-- 官方插件版本号 -->
<!-- 路径相关 -->
<project-local-repo>${project.basedir}/../maven/repo</project-local-repo>
<!-- others -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${fasterxml.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${fasterxml.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<!-- 开发环境下载maven依赖 -->
<repositories>
<repository>
<id>alimaven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</repository>
</repositories>
</project>
定义了4个子模块:dao、facade、portal、service。
父级项目中的pom.xml文件使用的packaging配置一定为pom。父级的pom文件只作项目的子模块的整合,在maven packaget时不会生成jar/war压缩包。
packaging如果不进行配置,它的默认值是jar,代表Maven会将项目打成一个jar包。在Maven build parent的时候,它会根据子模块的相互依赖关系整理一个build顺序,然后依次build。
通过标签properties、dependencyManagement、dependencies,父模块抽取各个子模块公用的依赖,统一管理依赖包版本号,从而保持各个子模块依赖版本一致。实际上子模块从父模块继承一切东西,包括依赖,插件配置等等。
dao模块的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>earth</artifactId>
<groupId>ymqx.com</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dao</artifactId>
<properties>
<!-- 环境设置 -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<maven-compiler-plugin.version>3.6.1</maven-compiler-plugin.version>
</properties>
<dependencies>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://10.189.16.16:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://10.189.16.16:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
parent标签配置父项目earth的坐标GAV(groupId, artifactId, version)。
facade模块的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>earth</artifactId>
<groupId>ymqx.com</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>facade</artifactId>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>releases</id>
<url>http://10.189.16.16:8081/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>snapshots</id>
<url>http://10.189.16.16:8081/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
portal模块的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>earth</artifactId>
<groupId>ymqx.com</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>portal</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>service</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 使用spring-boot-maven-plugin打包独立可执行程序 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>1.4.2.RELEASE</version>
<configuration>
<finalName>earth</finalName>
<classifier>1.0-SNAPSHOT</classifier>
<outputDirectory>../target</outputDirectory>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
portal模块定义了项目构建信息,每个模块生成对应的JAR包后,再加上项目运行时依赖,再次repackage重新打包,生成一个胖JAR。这样才可以使用命令行java -jar JAR_FILE.jar来执行重新打包好的JAR文件。
build标签 详见《Maven-build》
service模块的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>earth</artifactId>
<groupId>ymqx.com</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service</artifactId>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>dao</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>facade</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</project>
模块之间的引用:
portal模块引用了service模块。
service模块引用了dao模块、facade模块。
模块的编译顺序
portal模块引用了service模块,那么在编译portal模块时,maven会自动根据依赖关系,先将service模块进行编译;而service模块引用了dao模块、facade模块,则会先编译dao模块、facade模块,再编译service模块。
总体编译顺序:dao模块 -> facade模块 -> service模块 -> portal模块
项目打包后情况
service-1.0-SNAPSHOT.jar:
service-1.0-SNAPSHOT.jar中只包含service模块下编译后的class文件,并没有依赖包。
portal-1.0-SNAPSHOT.jar:
portal-1.0-SNAPSHOT.jar中只包含portal模块下编译后的class文件,也并没有依赖包。
earth-1.0-SNAPSHOT.jar:
- BOOT-INF:应用程序代码和依赖包
- META-INF:maven相关文件
- org:org.springframework.boot.loader,SpringBoot提供的bootstrap的类。
- BOOT-INF/classes:应用程序的代码编译后的class文件
- BOOT-INF/lib:应用程序依赖的其他的jar包文件
portal模块下编译后的class文件
BOOT-INF/lib包含应用程序依赖的其他的jar包文件:各个模块打包后的JAR包、其他项目依赖包。
好处
- 使用多模块的Maven配置,可以帮助项目划分模块,整体项目结构更清晰。
- 父模块统一管理依赖包版本号。
- 由于依赖的传递性,可以使子模块的POM精简,方便单个模块的构建,而不用每次都构建整个项目。