如何在 Java 应用中正确加载含内嵌依赖的 JAR(如“胖 JAR”)

大涛小哥_7390

大涛小哥_7390

2026-02-09

1078人浏览

原创

如何在 Java 应用中正确加载含内嵌依赖的 JAR(如“胖 JAR”)

本文详解为何不能直接将含 libs/ 目录的“胖 jar”作为普通依赖加载,以及在 spring boot、tomcat 等环境中安全引入外部库的标准化实践方案。

在 Java 生态中,常遇到一类结构特殊的外部 JAR:其内部不仅包含编译后的类(如 com/example/MyUtil.class),还嵌套了一个 libs/ 文件夹,内含 d1.jar、d2.jar 等依赖项——这类归档本质上是可执行的“胖 JAR”(Fat JAR),设计初衷是独立运行(如 java -jar xxx.jar),而非作为被其他应用引用的库依赖。

❌ 为什么不能直接加载含 libs 的 JAR?

Java 原生类加载器(包括 URLClassLoader、Spring Boot 的 LaunchedURLClassLoader 或 Tomcat 的 WebappClassLoader)不会自动扫描并加载 JAR 内部的嵌套 JAR。例如:

# 错误示例:以下命令无法让 JVM 自动识别 xxx.jar/libs/d1.jar 中的类
java -cp "xxx.jar" com.example.Main

即使通过 -Dloader.path=xxx.jar(Spring Boot)或 CLASSPATH=xxx.jar 启动,JVM 仅将 xxx.jar 本身加入类路径,而 libs/ 下的 JAR 仍处于“不可见”状态。强行解压后手动拼接 classpath(如 unzip xxx.jar -d tmp && java -cp "tmp:tmp/libs/*" ...)虽技术可行,但违背工程规范:缺乏版本控制、破坏可重现性、难以审计依赖、且易引发类冲突或加载顺序问题。

✅ 推荐方案:拆分依赖,按标准方式管理

正确的做法是解耦“发布包”与“依赖库”,将 xxx.jar 重构为纯功能 JAR(不含 libs/),并将 d1.jar、d2.jar 等作为独立依赖,通过以下任一方式引入:

方式 1:发布至私有 Maven 仓库(推荐)

将 d1、d2 等构件部署到 Nexus/Artifactory,然后在项目中声明标准依赖:

Java调试
Java调试

通过 JDWP 实现 Java 远程调试:连接远程 JVM、设置断点、单步执行代码、查看变量值、获取调用栈。适用于需要调试远程 Java 应用、排查运行时状态、追踪代码执行流程的场景。 术语注解 JDWP:Java Debug Wire Protocol,Java 调试有线协议(Java 远程调试底层通信协议) remote JVM:远程 Java 虚拟机 step through code:代码单步调试(步入 / 步过 / 步出调试) inspect variables:变量查看 / 变量检视 stac

下载
<!-- Maven pom.xml -->
<dependency><groupid>com.tonny.xxx</groupid><artifactid>d1</artifactid><version>4.1</version></dependency><dependency><groupid>com.tonny.xxx</groupid><artifactid>d2</artifactid><version>2.7</version></dependency>

Spring Boot 会自动将其纳入 BOOT-INF/lib/;Tomcat 应用则可通过 maven-war-plugin 打包至 WEB-INF/lib/。

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

若无法接入仓库,可使用 system 显式指定本地路径(注意:Maven 3.8.1+ 默认禁用 system scope,需配合 -Dmaven.enforcer.skip=true 或降级配置):

<dependency><groupid>com.tonny.xxx</groupid><artifactid>d1</artifactid><version>4.1</version><scope>system</scope><systempath>${project.basedir}/lib/d1.jar</systempath></dependency>
⚠️ 注意事项: systemPath 必须为绝对路径或基于 ${project.basedir} 的相对路径; 此方式不参与依赖传递,其他模块无法继承该依赖; 严禁在 CI/CD 流水线中使用,会导致构建环境不一致。

方式 3:Spring Boot 特定扩展(高级场景)

对 Spring Boot 应用,若必须动态加载外部 JAR 及其依赖,可自定义 URLClassLoader 并递归解析嵌套 JAR(需自行实现 JarFile 解析逻辑),但强烈建议仅用于插件化架构等特殊需求,而非常规依赖管理。

总结

  • “胖 JAR” ≠ 可复用库:其 libs/ 结构是运行时封装策略,非依赖管理契约;
  • 坚持依赖显式化:每个 JAR 应有唯一坐标(GAV),由构建工具统一解析;
  • 优先选择远程仓库,次选本地 system 依赖,避免手动解压 + classpath 拼接;
  • 在微服务或模块化架构中,应推动上游将 xxx.jar 发布为合规 Maven 构件,从根本上解决问题。

遵循以上原则,既能保障依赖清晰可溯,又能兼容 Spring Boot、Tomcat、传统 Java SE 等各类运行环境。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

java

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.10.26

885

5

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

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

2024.02.23

324

5

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

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

2024.02.23

489

5

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

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

2024.02.23

305

5

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

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

2024.02.23

348

5

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

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

2024.02.23

349

5

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

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

2024.02.23

601

5

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

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

2024.02.23

322

5

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

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

2024.02.23

3013

5

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习