Maven-modules

2023-03-28 14:35:35

概述

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精简,方便单个模块的构建,而不用每次都构建整个项目。
  • 作者:不会叫的狼
  • 原文链接:https://blog.csdn.net/weixin_40017062/article/details/122652298
    更新时间:2023-03-28 14:35:35