0

0

如何在Java应用中正确加载包含嵌套依赖的JAR包

霞舞

霞舞

发布时间:2026-02-09 14:59:14

|

147人浏览过

|

来源于php中文网

原创

如何在Java应用中正确加载包含嵌套依赖的JAR包

本文探讨了为何不能直接将“胖jar”(fat jar)作为外部库加载,以及在spring boot、tomcat等环境中安全引入含内嵌依赖(如`libs/d1.jar`)的jar的规范做法。核心结论是:应拆分胖jar,将其转为标准依赖,并通过maven/gradle或`loader.path`显式管理各依赖项。

在Java生态中,常遇到一类结构特殊的外部JAR包:其内部不仅包含编译后的类文件,还嵌套了一个libs/目录,存放多个依赖JAR(如d1.jar、d2.jar)。这类JAR本质上是一个可执行胖JAR(fat JAR)——设计初衷是独立运行(如java -jar xxx.jar),而非作为被其他项目引用的库。JVM和主流容器(Spring Boot、Tomcat)的类加载机制默认不支持递归扫描JAR内的嵌套JAR。这意味着即使你通过-classpath xxx.jar或Spring Boot的--loader.path=xxx.jar启动,JVM只会加载xxx.jar顶层的class,而忽略libs/下的所有依赖,导致ClassNotFoundException。

❌ 错误做法:尝试直接加载胖JAR

有人试图解压胖JAR再批量添加路径:

# 解压并手动加入类路径(不推荐!)
unzip xxx.jar -d temp/
java -cp "temp/:temp/libs/*" com.example.Main

这种方式破坏构建可重现性,易引发版本冲突、路径污染,且无法被Maven/Gradle依赖解析器识别,违背Java模块化最佳实践。

✅ 推荐方案:标准化依赖管理

方案1:发布为独立Maven依赖(首选)

将xxx.jar重构为普通库JAR(不含libs/目录),并将d1.jar、d2.jar分别发布至私有或公共Maven仓库(如Nexus、Maven Central)。在项目中声明清晰依赖:

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

SciMaster
SciMaster

全球首个通用型科研AI智能体

下载


    com.tonny.xxx
    xxx-core
    1.0.0


    com.tonny.xxx
    d1
    4.1


    com.tonny.xxx
    d2
    2.3

方案2:本地系统依赖(仅限开发/离线场景)

若无法上传仓库,可使用Maven system scope(注意:Spring Boot Maven Plugin默认跳过system依赖打包,需额外配置):


    com.tonny.xxx
    d1
    4.1
    system
    ${project.basedir}/lib/d1.jar

⚠️ 注意事项:

  • system依赖不会被传递,下游项目需重复声明;
  • 构建时需确保lib/目录存在且路径正确;
  • 生产环境强烈建议改用私有仓库替代。

方案3:Spring Boot专用 —— loader.path + 显式依赖

对已有的胖JAR,可提取其libs/内容到独立目录,再通过loader.path统一加载:

# 提取依赖(一次性操作)
mkdir -p external-deps
unzip xxx.jar 'libs/*' -d external-deps/
# 启动时指定全部JAR路径
java -Dloader.path="external-deps/libs/" -jar myapp.jar

此时需确保myapp.jar的MANIFEST.MF中包含org.springframework.boot.loader.JarLauncher,且Spring Boot版本 ≥ 2.3(支持多级loader.path)。

总结

胖JAR ≠ 库JAR。任何试图绕过标准依赖管理机制(Maven/Gradle)、依赖运行时动态解压或路径拼接的做法,都会牺牲可维护性、可测试性和环境一致性。正确的路径是:解耦胖JAR,回归语义化依赖声明——让每个JAR各司其职,由构建工具统一解析、校验与隔离。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
如何配置Tomcat环境变量
如何配置Tomcat环境变量

配置Tomcat环境变量需要在系统中添加CATALINA_HOME变量,并将Tomcat的安装路径添加到PATH变量中。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

114

2023.10.26

idea如何集成Tomcat
idea如何集成Tomcat

idea集成Tomcat的步骤:1、添加Tomcat服务器配置;2、配置项目部署;3、运行Tomcat服务器;4、访问项目;5、注意事项;6、关闭Tomcat服务器。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

170

2024.02.23

怎么查看Tomcat源代码
怎么查看Tomcat源代码

查看Tomcat源代码的步骤:1、下载Tomcat源代码;2、在IDEA中导入Tomcat源代码;3、查看源代码;4、理解Tomcat的工作原理;5、参与社区和贡献;6、注意事项;7、持续学习和更新;8、使用工具和插件。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

98

2024.02.23

常见的tomcat漏洞有哪些
常见的tomcat漏洞有哪些

常见的tomcat漏洞有:1、跨站脚本攻击;2、跨站请求伪造;3、目录遍历漏洞;4、缓冲区溢出漏洞;5、配置漏洞;6、第三方组件漏洞。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

166

2024.02.23

tomcat日志乱码怎么解决
tomcat日志乱码怎么解决

tomcat日志乱码的解决办法:1、修改tomcat的日志编码设置;2、检查ide的编码设置;3、检查操作系统的编码设置;4、使用过滤器处理日志;5、检查外部系统的编码设置;6、检查文件编码方式等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

154

2024.02.23

weblogic和tomcat有哪些区别
weblogic和tomcat有哪些区别

weblogic和tomcat的区别:1、功能;2、性能;3、规模;4、价格;5、安全性;6、配置和管理;7、社区支持;8、集成能力;9、升级和更新;10、可靠性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

199

2024.02.23

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

237

2024.02.23

tomcat启动闪退怎么解决
tomcat启动闪退怎么解决

tomcat启动闪退的解决办法:1、检查java环境;2、检查环境变量配置;3、检查端口被占用;4、检查配置文件编码;5、检查启动时需要的配置文件;6、检查相关文件是否丢失;7、检查防火墙和杀毒软件设置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

165

2024.02.23

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

125

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.4万人学习

C# 教程
C# 教程

共94课时 | 9万人学习

Java 教程
Java 教程

共578课时 | 61.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号