maven-jlink-plugin入门

【JDK17】Jlink一秒生成精简的JRE 通过上述工具,可灵活实现模块化开发与部署,满足不同场景下的精简 JRE 需求。 阅读详情

一、背景

JDK 9 引入了 模块系统(JPMS),把庞大的 JDK 拆成了上百个模块。
这样我们就可以:

  • 只引入应用需要的模块;

  • 用 jlink 工具生成一个定制化 runtime 镜像;

  • 从“依赖系统 JRE” 到 “自带专属 JRE”。

总结:

它是 Maven 对 JDK 自带工具 jlink 的封装,让模块化构建、镜像生成、依赖分析自动化。


二、原理:它到底做了什么

从执行流程看,它本质上完成这三件事:

(1)分析模块依赖树

它会解析:

  • 你的 module-info.java;

  • 依赖的模块(无论是 JDK 模块还是第三方模块);

  • 并根据 Maven 依赖生成一棵 模块依赖树。

例如:

com.example.app
 ├─ java.base
 ├─ java.sql
 └─ org.apache.logging.log4j

(2)调用 jlink 进行镜像生成

maven-jlink-plugin 会在目标目录下执行等价于:

jlink \
  --module-path target/classes:target/dependency \
  --add-modules com.example.app \
  --launcher app=com.example.app/com.example.app.Main \
  --output target/runtime \
  --strip-debug \
  --compress=2 \
  --no-header-files \
  --no-man-pages

结果是:

target/runtime/
├─ bin/app
├─ conf/
├─ lib/
└─ release

这个 runtime 就是一个独立可执行的、定制 JRE 镜像。

(3)支持与 jpackage 链接

maven-jlink-plugin 生成的 runtime 可直接喂给 maven-jpackage-plugin,后者能打成 .exe、.deb、.pkg 安装包或 Docker 基镜像。


三、核心配置详解

下面是官方参数的“全家桶级别”解释。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jlink-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <goals>
        <goal>jlink</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <output>${project.build.directory}/runtime</output>
    <modulePaths>
      <modulePath>${project.build.outputDirectory}</modulePath>
      <modulePath>${project.build.directory}/dependency</modulePath>
    </modulePaths>
    <addModules>
      <addModule>com.example.app</addModule>
    </addModules>
    <launcher>app=com.example.app/com.example.app.Main</launcher>

    <stripDebug>true</stripDebug>
    <compress>2</compress>
    <noHeaderFiles>true</noHeaderFiles>
    <noManPages>true</noManPages>
    <jlinkExecutable>${java.home}/bin/jlink</jlinkExecutable>
  </configuration>
</plugin>

主要参数说明:

参数名说明
output输出路径。生成的 runtime 镜像目录。
modulePathsjlink 搜索模块的路径。通常包括:编译输出 + 依赖目录。
addModules指定要加入镜像的模块(可以是 app 模块 + JDK 模块)。
launcher创建一个启动器脚本:别名=模块名/主类。
stripDebug去除 .class 中的调试信息,减小体积。
compress压缩级别(0 无压缩、1 常规、2 最大压缩)。
noHeaderFiles移除头文件(减少体积)。
noManPages移除 man 手册页(减少体积)。
jlinkExecutable指定 jlink 可执行文件路径,通常不需改。

四、生命周期集成

maven-jlink-plugin 通常绑定在 package 阶段之后执行。
常见执行链:

mvn clean package jlink:jlink

如果要自动化,可以配置到 lifecycle:

<execution>
  <id>create-runtime</id>
  <phase>package</phase>
  <goals><goal>jlink</goal></goals>
</execution>

五、典型优化组合

构建极小运行时镜像(常用于容器):

<configuration>
  <stripDebug>true</stripDebug>
  <compress>2</compress>
  <noHeaderFiles>true</noHeaderFiles>
  <noManPages>true</noManPages>
  <ignoreSigningInformation>true</ignoreSigningInformation>
  <stripNativeCommands>true</stripNativeCommands>
  <verbose>true</verbose>
</configuration>

这种配置生成的 runtime 通常只有 30–60MB,且完全自包含。


六、Docker 示例

FROM scratch
COPY target/runtime /opt/runtime
WORKDIR /opt/runtime
ENTRYPOINT ["./bin/app"]

这是真正意义上的 零依赖 Java 容器,比传统 openjdk:17-jdk-slim 小几十 MB。


七、注意事项

  1. 必须是模块化项目
    需要 module-info.java,否则无法分析模块依赖。

  2. 第三方库未模块化
    对未显式声明模块的 jar,jlink 会自动生成 automatic module,但可能导致命名冲突。

  3. jlink 只适用于 Java 9+
    若你使用 JDK 8 或更早版本,无法使用。

  4. 多平台兼容性
    runtime 镜像与构建平台绑定,例如在 macOS 构建的 runtime 无法在 Linux 运行。


八、实践建议

  • 在 CI/CD 流程中,把 maven-jlink-plugin 放到独立 stage,生成 runtime 后缓存;

  • 对 Spring Boot 3+ 模块化项目,建议结合 spring-boot-jarmode-tools;

  • 若要发布安装包,直接串联 maven-jpackage-plugin。


九、总结

maven-jlink-plugin = Maven 模块化构建 + jlink Runtime 构建自动化
它是 Java 模块化应用走向云原生、自包含、轻量运行时的关键工具。

JavaFX项目实战:用moditect-maven-plugin解决Jlink自动模块化难题 本文针对JavaFX项目使用Jlink打包时遇到的“自动模块无法使用”难题,提供了基于moditect-maven-plugin的实战解决方案。通过自动化生成模块描述符,该插件能将非模块化依赖转换为Jlink兼容的模块,从而顺利构建精简的独立运行时映像。文章详细介绍了在JDK17环境下的配置步骤、常见错误处理及与maven-jlink-plugin的协作技巧,帮助开发者高效解决模块化部署的痛点。 阅读详情

相关推荐

使用jlink工具模块化Java应用,结合Docker优化容器镜像(下)

使用jlink工具模块化Java应用,结合Docker优化容器镜像(上) 使用jlink工具模块化Java应用,结合Docker优化容器镜像(中) 依赖统一管理 当项目中的依赖越来越多时,对模块的管理会越发的复杂,容易出错。这里使用maven-dependency-plugin插件对依赖做统一的管理,减少工作量,避免不必要的模块管理工作。注意:这个插件需要放在第一个插件的位置,避免将其它插...

hlm2016的博客 968

jpack-maven-plugin 项目使用教程

jpack-maven-plugin 项目使用教程 1. 项目目录结构及介绍 jpack-maven-plugin 是一个用于对 SpringBoot 服务打包为 Windows、Linux、Docker 和 Helm Chart 下可部署包的 Maven 插件。以下是项目的目录结构及其介绍: jpack-maven-plugin/ ├── src/ │ ├── main/ │ │ ├...

gitblog_00055的博客 1235

JDK26模块化实战:jlink精简镜像与jpackage云原生打包

Java模块化是自JDK9引入的核心架构演进,其本质是通过显式依赖声明和强封装机制重构JVM类加载逻辑,提升启动性能、内存效率与部署安全性。随着JDK26将JLink设为默认构建环节、JPackage强制输出app-image格式,模块化已从可选特性升级为云原生Java应用的交付基础设施。技术价值体现在三方面:启动耗时降低70%+、运行时内存峰值压缩至1/4、Docker镜像体积减少60%以上;典型应用场景包括边缘计算(如蓝牙控灯软件)、微服务容器化部署及多版本共存的企业级开发环境(如Hadoop+实时计算

weixin_33800463的博客 437

maven-jlink-plugin插件的简单使用

maven-jlink-plugin插件的使用maven-jlink-plugin插件添加插件编写代码打包 maven-jlink-plugin插件 介绍省略 添加插件 添加仓库地址 <pluginRepositories> <pluginRepository> <url>https://repository.apache.org/content/repositories/snapshots</url> <id&g

mzh1994s的博客 2210

JDK 9+无独立JRE?手把手教你用jlink打造专属精简运行时

Java运行时环境(JRE)是Java程序执行的基石,它包含了Java虚拟机(JVM)和核心类库。随着Java 9模块化系统(JPMS)的引入,其分发模型发生了根本性变革,旨在实现更精细的依赖管理和更小的部署体积。这一变革的核心技术价值在于支持创建定制化的运行时映像,从而显著减少资源占用、提升安全性和部署效率,尤其适用于容器化、微服务及资源受限的边缘计算场景。本文聚焦于解决因JDK 9+不再内置独立JRE目录而引发的部署难题,详细解析如何使用官方jlink工具,并结合jdeps依赖分析,为你的应用生成量身定

weixin_34008784的博客 457

基于maven-jar-plugin打造一款自动识别主类的maven打包插件

在Java项目构建过程中,MANIFEST.MF文件中的Main-Class属性配置是一个关键但容易出错的环节。传统方式需要在pom.xml中显式声明主类路径,这不仅增加了维护成本,在大型多模块项目中更可能因配置遗漏导致运行时异常。Spring Boot通过@SpringBootApplication注解实现自动识别主类的机制广受好评,但在非Spring Boot项目中这种能力却难以直接复用。 本文将深入探讨如何通过开发mainclass-finder-maven-plugin自定义插件,在Maven构建

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 2592

Maven 构建 JavaFX 完整教程:基于 OpenJFX Samples 的 javafx-maven-plugin 实战

Maven 构建 JavaFX 应用是当前最主流的 Java 桌面开发方式之一。本文将基于 OpenJFX 官方 samples 项目(一个集成了 CLI、Maven、Gradle 等多种构建方式的 JavaFX 示例集合),手把手带你掌握 javafx-maven-plugin 的配置、运行与打包全流程。无论你是刚接触 JavaFX 的新手,还是想从命令行手工编译转向 Maven 自动化构建的老

gitblog_01147的博客 285

基于Maven的JDK9模块化项目实战:jmod与jlink工具集成示例

<goals></goals>

weixin_27645199的博客 856

JavaFX Maven Plugin:简化JavaFX应用开发的终极指南

JavaFX Maven Plugin是专为JavaFX 11+应用设计的Maven插件,它能显著简化JavaFX与Maven的集成流程。作为OpenJFX社区维护的开源项目,这个插件让开发者能够轻松地在Maven生命周期中处理JavaFX相关的任务,包括运行、测试和打包应用程序。 ## 为什么选择JavaFX Maven Plugin?🚀 在传统的JavaFX开发中,配置构建流程往往需要大

gitblog_00740的博客 769

maven-jlink-plugin:Apache Maven JLink插件

为贡献 您已发现错误或对超酷的新功能有任何想法? 贡献代码是将某些东西还给开源社区的好方法。 在深入研究代码之前,我们需要一些准则供贡献者遵循,以便我们有机会掌握最新知识。 入门 确保您拥有。 确保您具有。 如果您打算实施一项新功能,则有必要先在上讨论您的更改。 这样,您可以确保您不会浪费时间在Apache Maven范围之外的东西上。 假设您的问题不存在,请提交该问题的票证。 清楚地描述问题,包括在出现错误时重现的步骤。 确保填写您知道存在问题的最早版本。 在GitHub上分叉存储库。 进行和提交更改 我们通过GitHub接受拉取请求。 是贡献者交流的主要渠道。 有一些准则可使我们更容易地应用PR: 从您想作为工作基础的位置创建一个主题分支(通常是master分支)。 将更改推送到存储库分支中的主题分支。 提交逻辑单元。 尊重原有的代码风格:使用相同的 ,补丁应该只强调实际的差异,不被任何格式问题感到不安: 仅将空格用于缩进。 创建最小差异-禁用诸如重新格式化源代码或组织导入之类的保存操作。 如果您认为应重新格式化源代码,请为此更改创建一个单独的PR。 在提

mvn-jlink:Maven插件提供了在Maven项目中使用jlink工具的方式

变更日志 1.1.0(2020年3月27日) 改进了网关超时响应的处理 重新设计了ADOPT提供程序以通过 添加了将通过Authorization标头提供的authorization属性 增加测试 改进的ADOPTGIT提供程序 为检测到的剩余限制标头添加了日志记录 1.0.7(2020年2月2日) 增加了对的加载JDK的支持 1.0.6(2020年1月29日) 增加了对属性的支持以覆盖某些配置参数 改进了cache-jdk mojo,增加了通过ANT模式搜索缓存的JDK根目录中文件的功能,并将找到的路径作为项目属性放置 介绍 从Java 9开始,JDK具有模块(Jigsaw项目),并

Java项目打包实战:从Maven基础到Spring Boot与Docker分层优化

在Java项目构建与部署中,依赖管理和打包部署是核心环节。Maven作为主流的构建工具,其打包机制直接决定了应用的可移植性和部署效率。通过不同的插件策略,开发者可以解决类路径、资源加载和依赖冲突等工程难题。例如,maven-shade-plugin通过重命名包路径巧妙处理依赖冲突,而spring-boot-maven-plugin则利用分层技术优化Docker镜像构建,显著提升CI/CD流水线的效率。这些实践对于构建高性能、易维护的Java应用,尤其在微服务和云原生场景下,具有重要的技术价值。本文将深入解析

392

从‘查理复用’到TM52F1363:深入剖析5脚188数码管的驱动原理与避坑指南

本文深入解析了5脚188数码管的驱动原理,重点介绍了查理复用技术如何通过5个IO引脚高效驱动188段显示,并详细探讨了TM52F1363单片机的寄存器配置与驱动实现。文章还提供了常见问题的解决方案和性能优化技巧,帮助开发者避免实际应用中的各种陷阱。

weixin_29159441的博客 477

JavaFX Maven Plugin:轻松构建现代化桌面应用的5个关键优势

还在为JavaFX应用与Maven的集成而烦恼吗?JavaFX Maven Plugin正是你需要的解决方案!这个由OpenJFX社区维护的开源项目专为JavaFX 11+应用设计,让开发者能够无缝地将JavaFX整合到Maven构建流程中。无论是新手还是资深开发者,都能通过这个插件快速上手,构建出色的桌面应用程序。 ## 🚀 为什么选择JavaFX Maven Plugin? ### 1.

gitblog_00405的博客 718

Axure RP 10表单数据提交制作

本文介绍了如何使用Axure RP 10实现表单数据提交。

Peppaaa的博客 989

RandLA-Net复现SemanticKITTI和S3DIS数据集

RandLA-Net复现KITTI和室内数据集

weixin_48845174的博客 4106

dockerfile-maven-plugin 1.4.13 实战:5步配置Maven多模块项目,一键推送阿里云镜像

本文详细介绍了如何使用dockerfile-maven-plugin 1.4.13在Maven多模块项目中实现Spring Boot应用的Docker镜像构建与阿里云容器镜像服务(ACR)推送的全流程。通过5步配置,包括环境准备、插件选型、多模块项目结构设计、子模块深度配置和阿里云ACR认证集成,帮助开发者实现一键式镜像构建与推送,提升企业级Java应用的持续交付效率。

weixin_34268169的博客 334

PostgreSQL的学习心得和知识总结(一百二十六)|深入理解PostgreSQL数据库SQL执行时间计算 \timing 和 log_duration的使用和原理

1、参考书籍:《PostgreSQL数据库内核分析》2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》3、

孤傲小二~阿沐的博客 981

javafx-maven-plugin 的用法

JavaFX Maven插件是一个强大的工具,它可以帮助开发者在Maven项目中集成JavaFX,并进行应用程序的打包和运行。以下是关于的一些用法示例,这些示例基于上述搜索结果中的信息。

步子哥的博客 1353

【数字IC验证快速入门】26、SystemVerilog项目实践之AHB-SRAMC(6)(AHB-SRAMC SVTB Overview)

导读:作者有幸在中国电子信息领域的排头兵院校“电子科技大学”攻读研究生期间,接触到前沿的数字IC验证知识,旁听到诸如华为海思、清华紫光、联发科技等业界顶尖集成电路相关企业面授课程,对数字IC验证有了一些知识积累和学习心得。为帮助想入门前端IC验证的朋友,思忱一二后,特开此专栏,以期花最短的时间,走最少的弯路,学最多的IC验证技术知识。 文章目录一、内容概述二、AHB-SRAMC 验证计划 一、内容概述 AHB-SRAMC 验证计划 AHB-SRAMC 验证平台的架构图 AHB-SRAMC 验证平台的代.

悟已往之不谏 知来者之可追 2650

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

【Maven-plugin】有多少官方插件?

之前疏理了容器底层原理,现在回归主题,在阅读 next-public时发现 parent 将从多基础插件集成到 parent 仓库中单独维护,数量众多,故在此将所有插件分类整理。以达观其全貌,心中有数。以下是 Apache Maven 官方维护的核心插件列表(按功能分类),这些插件的 Group ID 通常是。由于版本和插件会随 Maven 更新而变化,建议结合。建议根据实际需求选择插件,并注意插件的版本兼容性。

Talbot3的笔记 1484

WorkBuddy CAD 审图救命课:约束、单位、尺寸链一次查清,打样前拦住返工

最危险的 CAD 文件不是打不开,而是看起来完整却混用了毫米与英寸、草图欠约束、关键尺寸没有来源。审图任务必须先列规则,再输出问题位置。 本课不会用“AI 一键完成”制造错觉,而是把 WorkBuddy、FreeCAD 0.21.2、OpenCascade 7.7 与人工审阅组成一条可复现链路。你会从“一份模拟 STEP 文件、参数表、装配基准与审图标准”出发,得到“单位报告、约束清单、尺寸链风险表与人工复核标记”,并学会用真实命令、错误信号和停止条件判断成果能不能进入下一阶段。

yueyeguzhuo的专栏 260

javafx-maven-plugin一键打包javafx成中文安装包

一键打包javafx成中文安装包

a974988176的博客 3942

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VS Code 轻量级 JavaFX 开发环境搭建:基于 OpenJFX Samples 的完整攻略

想用 VS Code 搭建 **JavaFX 开发环境**却总被各种报错劝退?别担心,这篇完整攻略将手把手带你完成从环境准备、依赖安装到成功运行 JavaFX 应用的全过程。我们直接基于官方开源的 **OpenJFX Samples** 示例集合来实践——它本身就是一套"开箱即用"的 JavaFX 入门教程,覆盖命令行、Maven、Gradle 以及各大 IDE 的多种运行方式,尤其对 VS Co

gitblog_00476的博客 255

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 模块化模式
下一篇: Colima 入门
fire-flyer
博客等级 码龄14年 218粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fire-flyer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值