Java模块化:为Spring Boot应用创建自定义运行时

java模块化:为spring boot应用创建自定义运行时

本文旨在指导读者如何为基于Java 19和Spring Boot 3.0的Maven项目创建最小化的自定义运行时镜像。我们将探讨使用`jdeps`分析依赖的局限性,并解决在使用`jlink`构建自定义运行时时常见的`NoClassDefFoundError`,特别是针对`java.beans.PropertyEditorSupport`的缺失问题,最终提供一个包含必要模块的正确`jlink`命令。

简介:Java模块化与自定义运行时

Java平台模块系统(JPMS),自Java 9引入,旨在提高应用的可靠性、安全性,并允许创建更小、更高效的运行时镜像。jlink工具是JPMS的核心组件之一,它能够根据应用程序实际所需的模块来构建一个定制的JRE,从而显著减小部署包的大小。这对于微服务、容器化部署以及资源受限的环境尤其有价值。

然而,对于非模块化或混合模块化(如Spring Boot应用,通常打包为包含所有依赖的“fat JAR”)的应用,确定其所需的完整JDK模块集可能具有挑战性。Spring Boot应用由于其广泛的依赖和内部机制,往往会隐式地依赖JDK中的多个模块。

Spring Boot 应用示例与初始问题

我们从一个使用start.spring.io创建的简单Spring Boot应用开始,配置如下:

立即学习“Java免费学习笔记(深入)”;

构建工具: MavenJava版本: Java 19Spring Boot版本: 3.0额外依赖: commons-lang3

pom.xml配置示例:

    4.0.0            org.springframework.boot        spring-boot-starter-parent        3.0.0                com.example    demo    0.0.1-SNAPSHOT    demo    Demo project for Spring Boot            19                            org.springframework.boot            spring-boot-starter                            org.springframework.boot            spring-boot-starter-test            test                            org.apache.commons            commons-lang3                                                    org.springframework.boot                spring-boot-maven-plugin                        

主应用类 DemoApplication.java 如下:

package com.example.demo;import org.apache.commons.lang3.StringUtils;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        String mix = "MIX";        if (StringUtils.isNoneBlank(mix)) {            System.out.println(mix);        }        SpringApplication.run(DemoApplication.class, args);    }}

编译并打包后,可以通过 java -jar target/demo-0.0.1-SNAPSHOT.jar 成功运行。

使用 jdeps 分析依赖与遇到的挑战

为了创建自定义运行时,第一步通常是使用jdeps工具分析应用程序的模块依赖。对打包后的Spring Boot fat JAR执行jdeps命令:

jdeps target/demo-0.0.1-SNAPSHOT.jar

输出会显示许多内部依赖以及对java.base和java.logging的依赖,但也会有大量的not found或指向demo-0.0.1-SNAPSHOT.jar本身的条目。例如:

demo-0.0.1-SNAPSHOT.jar -> java.basedemo-0.0.1-SNAPSHOT.jar -> java.loggingdemo-0.0.1-SNAPSHOT.jar -> not found   com.example.demo                                   -> java.io                                            java.base   com.example.demo                                   -> java.lang                                          java.base   com.example.demo                                   -> org.apache.commons.lang3                           not found   com.example.demo                                   -> org.springframework.boot                           not found   # ... (大量输出)

这里的“not found”通常意味着jdeps无法在当前类路径或模块路径中找到对应的模块,这对于Spring Boot的fat JAR是常见的,因为其内部包含了所有依赖,而jdeps在分析时可能无法完全解析这些嵌套的依赖。因此,仅仅依赖jdeps对fat JAR的直接输出,可能无法准确识别所有必要的JDK模块。

初次尝试 jlink 及运行时错误

基于jdeps的部分输出,我们可能初步尝试使用java.base和java.logging模块来构建自定义运行时:

jlink --module-path $JAVA_HOME/jmods --add-modules java.base,java.logging --output mycustomrt

此命令会成功创建一个名为mycustomrt的自定义JRE。然而,当尝试使用这个自定义JRE运行Spring Boot应用时:

PHPCMS V9 PHPCMS V9

PHPCMS V9(后面简称V9)采用PHP5+MYSQL做为技术基础进行开发。V9采用OOP(面向对象编程)+ MVC设计模式,进行基础运行框架搭建。模块化开发方式做为功能开发形式。框架易于功能扩展,代码维护,优秀的二次开发能力,可满足所有网站的应用需求。 5年开发经验的优秀团队,在掌握了丰富的WEB开发经验和CMS产品开发经验的同时,勇于创新追求完美的设计理念,为全球多达10万网站提供助力,并

PHPCMS V9 296 查看详情 PHPCMS V9

mycustomrt/bin/java -jar target/demo-0.0.1-SNAPSHOT.jar

应用程序会抛出java.lang.NoClassDefFoundError: java/beans/PropertyEditorSupport错误,并导致应用启动失败。

java.lang.NoClassDefFoundError: java/beans/PropertyEditorSupport        at java.base/java.lang.ClassLoader.defineClass1(Native Method)        # ... (堆栈信息)Caused by: java.lang.ClassNotFoundException: java.beans.PropertyEditorSupport        # ... (堆栈信息)

这个错误表明,尽管我们添加了java.base和java.logging,但Spring Boot应用程序(或其某个依赖)还需要其他JDK模块,其中包含java.beans.PropertyEditorSupport类。

识别并添加缺失的模块

java.beans.PropertyEditorSupport类位于java.desktop模块中。虽然我们的Spring Boot应用可能没有直接使用图形界面(GUI),但java.beans包中的类,如PropertyEditorSupport,经常被框架用于属性绑定、配置处理和内省机制,即使在无头(headless)服务器环境中也是如此。

此外,Spring Boot应用及其依赖可能还会用到其他一些JDK模块,即使它们在jdeps的初始分析中不明显:

java.xml: 用于XML处理,许多配置或数据格式化可能需要。java.sql: 用于JDBC和数据库连接,即使没有直接配置数据库,一些数据抽象层也可能依赖它。java.prefs: 用于用户或系统偏好设置,某些库可能使用它进行配置存储。

综合考虑这些潜在的依赖,我们需要将这些模块也添加到jlink命令中。

解决方案:构建包含完整模块的自定义运行时

正确的jlink命令应包含java.base、java.logging以及我们通过错误信息和经验判断出的java.xml、java.sql、java.prefs和java.desktop模块。

执行以下命令创建自定义运行时:

jlink --module-path $JAVA_HOME/jmods       --add-modules java.base,java.logging,java.xml,java.sql,java.prefs,java.desktop       --output mycustomrt

命令解释:

–module-path $JAVA_HOME/jmods: 指定JDK模块的查找路径。–add-modules …: 明确指定需要包含在自定义运行时中的模块。–output mycustomrt: 指定生成的自定义运行时镜像的输出目录名称。

创建成功后,再次尝试使用这个新的自定义运行时来运行Spring Boot应用程序:

./mycustomrt/bin/java -jar target/demo-0.0.1-SNAPSHOT.jar

此时,应用程序应该能够正常启动并运行,不再出现NoClassDefFoundError。

总结与注意事项

为Spring Boot应用创建自定义运行时是一个优化部署的重要手段,但需要注意以下几点:

jdeps的局限性: 对于Spring Boot的fat JAR,jdeps可能无法完全揭示所有必要的JDK模块依赖。这通常需要结合运行时错误信息和经验来补充。迭代过程: 寻找最小化模块集可能是一个迭代的过程。从java.base开始,根据运行时错误逐步添加缺失的模块。常见模块: 对于大多数Spring Boot应用,除了java.base和java.logging,java.desktop(用于java.beans)、java.xml、java.sql、java.naming等模块也常常是必需的。模块化插件: 对于复杂的项目,可以考虑使用Maven或Gradle的模块化插件(如maven-jlink-plugin)来自动化模块依赖分析和运行时构建过程。压缩选项: jlink还提供了–compress选项来进一步减小运行时镜像的大小,例如–compress=2可以进行中等程度的压缩。彻底测试: 构建自定义运行时后,务必对应用程序进行彻底的功能测试,以确保所有必要的组件都已包含在内。

通过上述步骤,您可以为您的Spring Boot应用程序成功构建一个轻量级、定制化的Java运行时,从而实现更高效的部署和资源利用。

以上就是Java模块化:为Spring Boot应用创建自定义运行时的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/899542.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月28日 19:32:40
下一篇 2025年11月28日 19:33:02

相关推荐

  • 如何分析K线图?加密货币技术分析入门教程

    k线图是加密货币技术分析的基石,看似复杂的红绿柱体其实是市场情绪和价格行为的直观体现。本文将带你从零开始,学习如何解读k线图,掌握基础的加密货币技术分析技巧,为你的交易决策提供数据支持。 2025年加密货币主流交易所: 币安:   欧易:   火币: 什么是K线图? K线图(Candlestick …

    2025年12月8日
    000
  • 狗狗币交易所最新排行榜top10

    随着加密货币市场的不断发展,狗狗币(doge)作为最具代表性的 meme 币之一,吸引了大量投资者的关注。选择一个安全、高效的交易所进行交易至关重要。以下是当前狗狗币交易所的最新排行榜,涵盖了交易量、用户体验、安全性等多个维度的综合评估。 1. Binance 全球最大的加密货币交易所,提供高流动性…

    2025年12月8日 好文分享
    000
  • 币圈行情涨跌是不是只看BTC就够了 币圈免费观看行情网址推荐

    很多刚入圈的新手常听到一句话:“比特币涨,全市场就涨;比特币跌,全市场就跌。”这句话虽然在一定程度上反映了btc的市场主导地位,但并不能代表你只看btc行情就能完全掌握整个币圈的趋势。 因此,新手应综合观察BTC、ETH及主流赛道币种的行情变化,而不是只盯着一个币种。 以下是几个无需注册即可查看实时…

    2025年12月8日
    000
  • Binners Alpha、TrutaAI、Andken ERA:一个新时代?

    探索币安alpha推出trusta.ai合约与era代币空投热潮:值得参与吗? 币安Alpha、TrustaAI与ERA代币:一个新时代的开启? 加密市场再次掀起波澜!币安Alpha(Binance Alpha)正式推出Trusta.AI(TA)合约,并同步启动ERA代币的空投活动。这一系列动作究竟…

    2025年12月8日
    000
  • ETH和BTC 是什么?市场如何?一文看懂币圈金银币

    ETH / BTC 是什么? ETH/BTC 是以太坊价格(ETH)相对于比特币(BTC)价格的比率,代表用比特币来衡量以太坊的价值。 这个比率不仅代表着以太币相对比特币的兑换价格,更是观察市场信心、资金流向与生态演变的重要指标。 ETH/BTC:币圈金银比 以贵金属价格分析的角度,ETH / BT…

    2025年12月8日
    000
  • xrp币价格走势APP xrp币实时k线分析

    xrp币价格走势app是一款专为数字货币投资者打造的实用工具,用户可通过该应用实时查看xrp币的价格变动、k线图走势、历史行情等关键数据,帮助用户做出更明智的交易决策。本文提供了官方app下载链接,点击下方链接即可下载安装。 一、下载安装步骤 按照以下步骤可快速完成xrp币价格走势APP的下载安装:…

    2025年12月8日
    000
  • 代币经济体系重塑:新叙事下的机会与泡沫

    代币经济体系正处在重塑的关键阶段,在新叙事背景下带来了机遇的同时也伴随着风险与挑战,对投资者与项目方提出了更高的要求。 自比特币诞生以来,“代币经济”一直是加密行业最具颠覆性且最具争议的核心概念。与传统股权和债券不同,代币作为载体的经济系统具备融资、激励和治理的多重功能,因此在周期轮动中不断调整其叙…

    2025年12月8日
    000
  • 投资加密货币却看不懂K线?一文教你K线要怎么看

    k 线图是交易市场中的基础工具,能够帮助我们理解加密货币价格的波动情况以及买卖力量的对比。关键在于掌握影线、开盘价、收盘价以及颜色所代表的意义。 与传统市场不同的是,加密货币市场全年无休、24 小时运作,因此其K 线图在时间逻辑和颜色表达上也有所不同。 尽管K 线图无法预测未来价格,但如果结合其他分…

    2025年12月8日 好文分享
    000
  • 三分钟详细了解:稳定币以太坊还有上涨空间吗?

    关于它如何在与其他一层公链甚至它自身衍生出的二层网络竞争中站稳脚跟,仍存在诸多疑问。 然而,它终于迎来了一波显著的上涨趋势,近期走势已超越多个竞争对手。 我也与一些市场分析师进行了交流,他们指出,以太坊的行情尚未走到尽头。 以太坊突破 3000 美元关口,上行潜力犹存 在比特币(BTC)上周剧烈上涨…

    2025年12月8日 好文分享
    000
  • xrp币市场动态APP xrp币实时k线跟踪

    xrp币市场动态app是一款专为加密货币投资者打造的行情追踪工具,提供xrp币实时k线图表、价格波动监控、市场深度分析等多项实用功能。通过这款app,用户可以更高效地了解xrp币的市场动态,辅助投资决策。本文提供官方app下载链接,用户只需点击下方提供的链接即可快速下载安装。 下载安装教程 1、点击…

    2025年12月8日
    000
  • 稳定币、加密币、数字货币的区别

    稳定币、加密币与数字货币的核心区别在于属性与用途。1. 数字货币是广义概念,包含所有以电子形式存在的货币,如支付宝余额、游戏币等;2. 加密货币是数字货币的子集,使用区块链技术实现去中心化交易,如比特币、以太坊。 在数字资产的世界里,选择一个安全可靠的交易平台是投资成功的第一步。本文将为您梳理全球顶…

    2025年12月8日
    000
  • CPI是什么意思?CPI指数上涨/下降意味着什么?和PPI的关系

    在全球投资领域,消费者物价指数(cpi)是一项至关重要的经济数据。它不仅体现了消费者支出的变动情况,还对中央银行的货币政策产生直接影响,从而引发股市、债市和汇市的波动。cpi一直是国家衡量经济运行状况的重要依据之一。对于投资者而言,了解cpi的含义、其涨跌背后的经济信号以及如何据此调整投资策略,是把…

    2025年12月8日
    000
  • 比特币和瑞波币有何不同?哪个更适合投资?瑞波币能取代比特币吗?

    比特币与瑞波币本质不同,不可简单比较或替代。1.比特币追求去中心化,旨在作为“数字黄金”成为价值储藏工具,总量固定、共识机制为工作量证明、交易速度慢且费用高;2.瑞波币则定位于高效实用的跨境支付桥梁,由瑞波公司主导发行,采用中心化共识机制,交易速度快且成本低;3.投资逻辑上,比特币代表去中心化价值网…

    2025年12月8日
    000
  • 币安返佣是什么 币安返佣怎么开

    币安返佣计划是一项双赢的激励措施,它不仅能让推荐人通过邀请好友获得持续的奖励,也能让被邀请的新用户在交易时享受手续费折扣,从而有效降低交易成本。理解其运作方式并正确设置,是充分利用这一福利的关键。 什么是币安返佣? 简单来说,币安返佣是一个推荐奖励系统。当一位现有用户(邀请者)通过其专属的推荐链接邀…

    好文分享 2025年12月8日
    000
  • 币安创新区项目从Alpha到币安现货上市,有哪些条件?

    目录 币安Alpha还是上架Binance现货的前哨站吗?上现货的全是崭新的正规军?和融资额相比,这些新币的表现算成功吗?总结 一个月前,我们对binance alpha上进行了积分空投的项目进行了梳理,尝试从这些项目积分空投后的价格表现入手去分析市场对不同概念代币的喜好度。 这次,我们切换到了一个…

    2025年12月8日
    000
  • Pump.fun(PUMP币)是什么?值得投资吗?PUMP币未来价格预测

    pump.fun (pump) 是加密领域中最具爆发力的首次代币发行项目之一,自面世以来,它持续突破障碍,通过快速上币和衍生品支持,维持了强劲的流动性和市场关注。当前的调整阶段正在为2025年及以后的更广泛市场回暖打下基础。 Pump(PUMP)币是什么? PUMP是meme币发行平台Pump.fu…

    2025年12月8日
    000
  • BTC当前价格查询攻略!主流行情工具评测比特币历史数据

    是否渴望拥有一个强大而全面的工具,能够让您随时随地洞察市场脉搏,轻松把握交易先机?一个优秀的行情与交易平台,不仅是您投资路上的得力助手,更是您在加密世界中稳步前行的坚实后盾。它将复杂的市场数据转化为直观的图表,将繁琐的交易流程简化为指尖的几次点击,让您从容应对市场风云。 本文将为您提供该应用的官方下…

    2025年12月8日
    000
  • 比特币与Avalanche的差异是什么?哪个更有前景?Avalanche能值得长期持有吗?

    比特币与Avalanche在技术架构、应用场景、市场表现等方面存在显著差异。1. 比特币采用PoW机制,区块生成时间为10分钟,交易吞吐量有限,而Avalanche具备亚秒级确认和高TPS,通过子网机制实现多链并行;2. 比特币主要用于价值储存与资产配置,Avalanche则构建了涵盖借贷、DEX、…

    2025年12月8日
    000
  • xrp今日价格行情APP xrp币价格今日行情走势实时观测

    xrp今日价格行情APP是一款专为XRP币种爱好者设计的行情观测工具,实时更新市场价格、走势图、交易量等核心数据,帮助用户更快掌握市场动态。1、点击本文提供的官方app下载链接,系统将自动开始下载;2、下载完成后,打开文件,按照提示完成安装;3、首次打开APP时,建议允许所需权限,以保证数据实时同步…

    2025年12月8日
    000
  • Grok 是什么?如何运作?如何使用Grok AI 实时识别加密货币信号

    以下是你提供内容的伪原创版本,已确保不改变文章大意,同时保留了原始图片位置,未添加任何解释或说明: 目录 什么是Grok? 为什么情绪在加密货币中如此重要? 案例:马斯克推文后PEPE 币的价格暴涨(2024 年3 月) Grok 如何检测加密货币交易信号 代币提及激增 2.情绪分析 交易者如何利用…

    2025年12月8日 好文分享
    000

发表回复

登录后才能评论
关注微信