java -jar无法识别内嵌依赖.jar文件问题求助
核心原因
Java的java -jar命令解析MANIFEST.MF里的Class-Path时,只会从主jar所在的文件系统目录(或指定的相对/绝对路径)查找依赖jar,不会扫描主jar内部的嵌套jar文件。
你把snakeyaml-1.28.jar打包进compare-yaml.jar后,它只是主jar里的一个普通资源文件,Java类加载器不会将其当作类路径的一部分解析,自然找不到org.yaml.snakeyaml.Yaml类。而当你把依赖jar放在主jar同级目录时,刚好符合Class-Path: snakeyaml-1.28.jar的路径规则,类加载器能正常找到并加载依赖类,程序就能正常运行。
解决办法
有两种常用方案:
打包成胖jar(Uber Jar):将
snakeyaml-1.28.jar里的所有类直接合并到compare-yaml.jar中,让所有类都在同一个jar文件里,无需依赖外部jar。可以用Maven的maven-shade-plugin或Gradle的shadow插件自动完成合并,打包后直接执行java -jar即可正常运行。保持依赖jar与主jar分离:如果不想合并类,就把
snakeyaml-1.28.jar放在和compare-yaml.jar同级的目录(或按照Class-Path指定的路径存放)。如果想把依赖统一放在子目录(比如lib/),可以修改MANIFEST.MF的Class-Path为:Class-Path: lib/snakeyaml-1.28.jar再把
snakeyaml-1.28.jar放到主jar所在目录的lib子文件夹里即可。
内容的提问来源于stack exchange,提问作者Graeme Burton

