Skip to content

Maven 项目配置详解:依赖与 Profiles 配置 ​

本文档详细介绍了一个 Maven 项目的 pom.xml 文件配置,包括项目属性、依赖管理以及不同环境下的 Profiles 配置。通过本文档,您将了解如何配置项目的构建参数、依赖库以及针对开发、生产和其他特定环境的定制化设置。

目录 ​


项目属性配置 ​

在 pom.xml 中,<properties> 标签用于定义项目的全局属性,这些属性可以在整个项目的构建过程中复用,简化配置管理。以下是各属性的详细说明:

xml
<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <java.version>1.8</java.version>
  <maven.compiler.source>${java.version}</maven.compiler.source>
  <maven.compiler.target>${java.version}</maven.compiler.target>
  <graalvm.version>23.1.1</graalvm.version>
  <tio-boot.version>2.1.8</tio-boot.version>
  <lombok-version>1.18.44</lombok-version>
  <hotswap-classloader.version>1.2.9</hotswap-classloader.version>
  <final.name>web-hello</final.name>
  <main.class>nexus.io.tio.web.hello.HelloApp</main.class>
</properties>

属性说明 ​

  • project.build.sourceEncoding: 设置项目源代码的编码格式为 UTF-8,确保在不同环境下的编码一致性。
  • java.version: 定义项目使用的 Java 版本,此处设置为 1.8。
  • maven.compiler.source 和 maven.compiler.target: 指定 Maven 编译器插件使用的 Java 源代码和目标字节码版本,均引用 java.version 属性。
  • graalvm.version: 定义 GraalVM 的版本号,为 23.1.1。
  • tio-boot.version: 集中管理 TIO Boot 依赖,按项目选用的依赖填写。
  • lombok-version: 集中管理 Lombok 依赖,用于简化 Java 代码中的常见任务。
  • hotswap-classloader.version: 集中管理 Hotswap Classloader 依赖,支持类的热替换功能。
  • final.name: 指定最终构建产物的名称为 web-hello。
  • main.class: 定义项目的主类全路径为 nexus.io.tio.web.hello.HelloApp。

依赖管理 ​

基础库的编译环境与运行验证步骤见 使用 JDK 8 构建基础库与验证运行环境。

项目的依赖库在 <dependencies> 标签中进行管理,确保项目在构建和运行时所需的所有库都被正确引入。

xml
<dependencies>
  <dependency>
    <groupId>nexus.io</groupId>
    <artifactId>tio-boot</artifactId>
    <version>${tio-boot.version}</version>
  </dependency>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok-version}</version>
    <optional>true</optional>
    <scope>provided</scope>
  </dependency>
  <dependency>
    <groupId>nexus.io</groupId>
    <artifactId>hotswap-classloader</artifactId>
    <version>${hotswap-classloader.version}</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
  </dependency>
</dependencies>

依赖说明 ​

  • tio-boot: TIO Boot 库,用于简化 TIO 框架的启动和配置。
  • lombok: Lombok 库,通过注解自动生成常用代码(如 getter/setter),提高开发效率。标记为 optional 和 provided,表示该依赖在编译时需要,但在运行时由外部提供。
  • hotswap-classloader: 支持类的热替换功能,便于在运行时动态更新类定义,无需重启应用。
  • junit: 用于单元测试的 JUnit 框架,作用域为 test,仅在测试阶段引入。

Profiles 配置 ​

Maven Profiles 允许为不同的构建环境定义特定的配置。本文档中的 pom.xml 文件定义了四个 Profiles:开发环境、生产环境、自定义环境(assembly)以及 GraalVM 环境。

xml
<profiles>
  <!-- 开发环境 -->
  <profile>
    <id>development</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <dependencies>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.3.3</version>
      </dependency>
    </dependencies>
  </profile>

  <!-- 生产环境 -->
  <profile>
    <id>production</id>
    <dependencies>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.3.3</version>
      </dependency>
    </dependencies>
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>2.7.18</version>
          <configuration>
            <mainClass>${main.class}</mainClass>
            <excludeGroupIds>org.projectlombok</excludeGroupIds>
          </configuration>
          <!-- 设置执行目标 -->
          <executions>
            <execution>
              <goals>
                <goal>repackage</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>

  <!-- 自定义环境 (assembly) -->
  <profile>
    <id>assembly</id>
    <dependencies>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.3.3</version>
      </dependency>
    </dependencies>
    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.2.0</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-assembly-plugin</artifactId>
          <version>3.1.1</version>
          <configuration>
            <archive>
              <manifest>
                <mainClass>${main.class}</mainClass>
              </manifest>
            </archive>
            <descriptorRefs>
              <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
            <appendAssemblyId>false</appendAssemblyId>
          </configuration>
          <executions>
            <execution>
              <id>make-assembly</id>
              <phase>package</phase>
              <goals>
                <goal>single</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>
  </profile>

  <!-- GraalVM 环境 (native) -->
  <profile>
    <id>native</id>
    <dependencies>
      <!-- GraalVM 环境使用 jdk log -->
      <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.7.31</version>
      </dependency>
      <!-- GraalVM -->
      <dependency>
        <groupId>org.graalvm.sdk</groupId>
        <artifactId>graal-sdk</artifactId>
        <version>${graalvm.version}</version>
        <scope>provided</scope>
      </dependency>
    </dependencies>
    <build>
      <finalName>${final.name}</finalName>
      <plugins>
        <plugin>
          <groupId>org.graalvm.nativeimage</groupId>
          <artifactId>native-image-maven-plugin</artifactId>
          <version>21.2.0</version>
          <executions>
            <execution>
              <goals>
                <goal>native-image</goal>
              </goals>
              <phase>package</phase>
            </execution>
          </executions>
          <configuration>
            <skip>false</skip>
            <imageName>${final.name}</imageName>
            <mainClass>${main.class}</mainClass>
            <buildArgs>
              -H:+RemoveSaturatedTypeFlows
              --allow-incomplete-classpath
              --no-fallback
            </buildArgs>
          </configuration>
        </plugin>
      </plugins>
    </build>
  </profile>
</profiles>

各 Profile 详解 ​

开发环境 (development) ​

  • Profile ID: development
  • 激活方式: 默认激活 (activeByDefault=true)
  • 依赖配置:
    • 引入 logback-classic 依赖,用于日志管理,版本为 1.2.3。

开发环境下,默认启用该 Profile,无需额外指定。logback-classic 提供了强大的日志记录功能,便于开发过程中调试和监控。

生产环境 (production) ​

  • Profile ID: production
  • 依赖配置:
    • 同样引入 logback-classic 依赖,用于生产环境的日志管理。
  • 构建配置:
    • 使用 spring-boot-maven-plugin 插件,版本为 2.7.4,用于打包 Spring Boot 应用。
    • 配置中指定主类 (mainClass) 和排除 org.projectlombok 组的依赖。
    • 设置执行目标为 repackage,确保生成可执行的 Spring Boot Jar 包。

生产环境下,该 Profile 需要显式激活。通过 spring-boot-maven-plugin,可以轻松构建和部署 Spring Boot 应用。

自定义环境 (assembly) ​

  • Profile ID: assembly
  • 依赖配置:
    • 引入 logback-classic 依赖,与其他环境一致。
  • 构建配置:
    • 使用 maven-jar-plugin 和 maven-assembly-plugin 插件,分别用于生成 Jar 包和包含所有依赖的可执行 Jar 包。
    • maven-assembly-plugin 配置中,指定主类和依赖打包方式 (jar-with-dependencies),并设置 appendAssemblyId 为 false,以简化最终文件名。
    • 在 package 阶段执行 single 目标,生成包含所有依赖的 Jar 包。

自定义环境适用于需要特定打包方式的场景,如分发包含所有依赖的单一 Jar 文件。

GraalVM 环境 (native) ​

  • Profile ID: native
  • 依赖配置:
    • 引入 slf4j-jdk14 作为日志实现,版本为 1.7.31,适配 GraalVM 环境的日志需求。
    • 引入 graal-sdk 依赖,版本引用 graalvm.version,作用域为 provided,表示在运行时由 GraalVM 提供。
  • 构建配置:
    • 设置最终文件名为 web-hello(由 final.name 属性定义)。
    • 使用 native-image-maven-plugin 插件,版本为 21.2.0,用于生成 GraalVM 的本地映像。
    • 插件配置中,指定生成的映像名称 (imageName)、主类 (mainClass) 以及构建参数 (buildArgs)。
    • 在 package 阶段执行 native-image 目标,生成原生可执行文件。

GraalVM Profile 适用于需要生成高性能原生可执行文件的场景,通过 Ahead-Of-Time (AOT) 编译优化应用的启动时间和资源占用。

总结 ​

本文档通过详细解析 pom.xml 文件中的项目属性、依赖管理以及多环境 Profiles 配置,帮助您理解如何在 Maven 项目中进行灵活的构建和依赖管理。根据不同的部署环境(开发、生产、自定义、GraalVM),合理配置 Profiles 可以显著提升项目的可维护性和部署效率。希望本文档能够为您的 Maven 项目配置提供有价值的参考。

MIT Licensed