Maven 项目配置详解:依赖与 Profiles 配置
本文档详细介绍了一个 Maven 项目的 pom.xml 文件配置,包括项目属性、依赖管理以及不同环境下的 Profiles 配置。通过本文档,您将了解如何配置项目的构建参数、依赖库以及针对开发、生产和其他特定环境的定制化设置。
目录
项目属性配置
在 pom.xml 中,<properties> 标签用于定义项目的全局属性,这些属性可以在整个项目的构建过程中复用,简化配置管理。以下是各属性的详细说明:
<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.0.3</tio-boot.version>
  <lombok-version>1.18.30</lombok-version>
  <hotswap-classloader.version>1.2.6</hotswap-classloader.version>
  <final.name>web-hello</final.name>
  <main.class>com.litongjava.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 库的版本为1.8.8。lombok-version: 设置 Lombok 库的版本为1.18.30,用于简化 Java 代码中的常见任务。hotswap-classloader.version: 定义 Hotswap Classloader 的版本为1.2.6,支持类的热替换功能。final.name: 指定最终构建产物的名称为web-hello。main.class: 定义项目的主类全路径为com.litongjava.tio.web.hello.HelloApp。
依赖管理
项目的依赖库在 <dependencies> 标签中进行管理,确保项目在构建和运行时所需的所有库都被正确引入。
<dependencies>
  <dependency>
    <groupId>com.litongjava</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>com.litongjava</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 环境。
<profiles>
  <!-- 开发环境 -->
  <profile>
    <id>development</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <dependencies>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
      </dependency>
    </dependencies>
  </profile>
  <!-- 生产环境 -->
  <profile>
    <id>production</id>
    <dependencies>
      <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.2.3</version>
      </dependency>
    </dependencies>
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>2.7.4</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.2.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 项目配置提供有价值的参考。
