前两天在整理一个工程的时候突发奇想,能不能把需要的jar都打到一个类似于war包的jar包里面去,但是不解开原始jar包,而是将之统一放到外面jar包中的一个lib目录下。
按这个思路试了好几次,都遇到了NoClassDefFoundError。一开始以为是manifest中配置有误,在几次尝试调整manifest文件仍然失败之后,觉得有必要查看一些类似的案例。
类似的案例比如SpringBoot工程打成的jar包,又比如jenkins的可以直接用jar命令调用的war包。找到相关的包分析了许久,仍然找不到端倪。
后来在Oracle的官方文档中找到了解释:
To load classes in JAR files within a JAR file into the class path, you must write custom code to load those classes. For example, if MyJar.jar contains another JAR file called MyUtils.jar, you cannot use the Class-Path header in MyJar.jar’s manifest to load classes in MyUtils.jar into the class path.
懒得翻译了,大意就是如果要引用jar中的jar,就需要编写额外的代码,如自定义的类加载器。SpringBoot打成的包就是这样做的。
参考文档:https://docs.oracle.com/javase/tutorial/deployment/jar/downman.html
#######
发表评论