之前介绍了 Java17模块化的JDK,模块化后按需使用Jlink 用于精简生成 JRE 环境,这让快速的开发环境增强了编码的愉悦感。在实际生产环境中使用 mave 进行项目的构建,其次再是精简 JRE 缩小容器镜像体积,为实现一体化的流程,使用 mave 插件来实现精简 JRE:
1. Maven 生态插件
(1) maven-jlink-plugin
- 官方插件:Apache Maven 官方维护,直接集成
jlink
工具。 - 功能:
- 生成自定义 JRE。
- 支持模块依赖分析、压缩和优化。
- 配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jlink-plugin</artifactId> <version>3.3.0</version> <configuration> <addModules>java.base,java.sql</addModules> <outputDirectory>target/myjre</outputDirectory> </configuration> </plugin>
(2) moditect-maven-plugin
- 第三方插件:专注于模块化项目支持。
- 功能:
- 自动生成
module-info.java
。 - 将传统 JAR 转换为模块化 JAR。
- 辅助生成精简 JRE。
- 自动生成
- 适用场景:需要处理非模块化依赖(如 Spring Boot)的项目。
- 配置示例:
<plugin> <groupId>org.moditect</groupId> <artifactId>moditect-maven-plugin</artifactId> <version>1.0.0</version> <executions> <execution> <configuration> <jlinkImage>true</jlinkImage> <modulePath>${project.build.directory}/modules</modulePath> </configuration> </execution> </executions> </plugin>
2. Gradle 生态插件
(1) org.gradle.java.experimental-jigsaw
- 官方实验性插件:支持 Java 模块化(JPMS)。
- 功能:
- 自动配置模块路径。
- 支持
jlink
任务生成 JRE。
- 配置示例:
plugins { id 'org.gradle.java.experimental-jigsaw' version '0.1.1' } jlink { addModules = ['java.base', 'java.sql'] outputDir = file("$buildDir/myjre") }
(2) org.javamodularity.moduleplugin
- 社区插件:功能全面的模块化支持。
- 功能:
- 自动生成
module-info.java
。 - 集成
jlink
和jdeps
。 - 支持 Spring Boot 和反射访问。
- 自动生成
- 配置示例:
plugins { id 'org.javamodularity.moduleplugin' version '1.8.12' } modularity { patchModule("spring.core", "spring-core-5.3.0.jar") }
3. 独立工具
(1) jlink
命令行工具
- 原生工具:Java 9+ 自带,无需插件。
- 功能:
- 直接生成精简 JRE。
- 完全手动控制模块依赖。
- 使用示例:
# 一秒直接生成 jlink --add-modules java.base,java.sql --output myjre
(2) jpackage
- Java 14+ 工具:打包应用为原生安装包。
- 功能:
- 集成 JRE 和应用为一个可执行文件。
- 支持 Windows/MSI、macOS/DMG、Linux/RPM 等格式。
- 适用场景:桌面应用分发。
- 使用示例:
jpackage --input target/ --name MyApp --main-jar myapp.jar
(3) jlink
+ Docker 多阶段构建
- 容器化方案:结合 Docker 构建最小化镜像。
- 示例 Dockerfile:
FROM eclipse-temurin:17-jdk as builder RUN jlink --add-modules java.base --output /myjre FROM debian:11-slim COPY --from=builder /myjre /opt/jre ENV PATH="/opt/jre/bin:$PATH" CMD ["java", "-jar", "/app.jar"]
4. 功能对比表
工具/插件 | 构建工具 | 核心功能 | 适用场景 |
---|---|---|---|
maven-jlink-plugin | Maven | 生成 JRE、模块依赖管理 | 纯 Java 或简单 Spring 项目 |
moditect-maven-plugin | Maven | 模块化转换、非模块化依赖处理 | 需要兼容传统库的复杂项目 |
org.javamodularity.moduleplugin | Gradle | 全功能模块化支持、反射配置 | Gradle 项目、Spring Boot |
jlink 命令行 | 无 | 手动生成 JRE | 快速验证或脚本化构建 |
jpackage | 无 | 应用打包为原生安装包 | 桌面应用分发 |
Docker 多阶段构建 | 无 | 容器化精简镜像 | 云原生部署 |
选择建议
-
Maven 项目:
- 优先使用
maven-jlink-plugin
(简单场景)。 - 需要处理非模块化依赖时,结合
moditect-maven-plugin
。
- 优先使用
-
Gradle 项目:
- 使用
org.javamodularity.moduleplugin
,支持自动模块化和反射配置。
- 使用
-
容器化部署:
- 结合
jlink
+ Docker 多阶段构建,生成超小镜像。
- 结合
-
桌面应用分发:
- 使用
jpackage
直接生成原生安装包。
- 使用
通过上述工具,可灵活实现模块化开发与部署,满足不同场景下的精简 JRE 需求。