[英]Weblogic - Why Java ClassLoader does not load classes from jars mentioned in empty manifest jar
我最近遇到一个场景,我们将有一个空清单 jar(即 jar,只有 META-INF/MANIFEST.MF 具有类路径属性)引用文件系统上某处的其他 jar 文件。 我相信此清单 jar 已创建为充当特定版本 jar 的软链接,以便消费者无需处理实施 jar 的次要版本更改。
manifest.jar:-
----META-INF/
--------MANIFEST.MF
Actual version specific implementation jar (test-1.1.jar):-
----META-INF/
--------MANIFEST.MF
----test/
--------Test1.class
在应用程序的类路径中包含 manifest.jar 不会加载实际实现 jar,因此我看到了 ClassNotFoundException。 知道为什么它不加载以及如何按预期加载此 jar 吗?
更新:
我使用示例可执行文件 jar 进行了尝试,它 (sun.misc.Launcher$AppClassLoader) 似乎按预期加载了 class。 在类路径中仅引用 manifest.jar 反过来包括实际实现 jar。
此外,我发现我们的项目确实有一个遗留的自定义 class 加载程序,不确定是否会导致这种奇怪的行为。
默认情况下,它不应该处理来自 manifest.jar 的其他 jars 的引用吗?
有没有办法检查这个自定义 class 加载器是否实际上引用了类路径中提到的 jars?
使用java -jar somejar.jar
时,类路径设置如下:
-cp
/ -classpath
开关被完全忽略。Class-Path
条目,即somejar.jar
被读取,按空格拆分,任何相对路径都相对于 jar 所在的目录解析,并用作类路径。Class-Path
条目,包括 somejar.jar 的 Class-Path 条目中列出的somejar.jar
文件被完全忽略。somejar.jar
清单中的Main-Class
条目,将在那里找到的字符串加载为 class,并调用其 main 方法。 您在Class-Path
条目中提到的任何 jars 中的任何Main-Class
条目都被完全忽略。 换句话说,这个代理概念并不能真正起作用。 您放入java -jar thejar.jar
中的 jar必须具有Main-Class
属性,并且必须在其Class-Path
属性中列出运行该应用程序所需的所有jars。
如果您改用它: java -cp somejar.jar:lib/dep1.jar:lib/dep2.jar:etc com.foo.Main
Class-Path
那么清单将被完全忽略,因此您在清单中设置的任何类Class-Path
或Main-Class
属性在这里无关紧要。
我认为您所观察到的可能是由 JAR file spec section on the Class-Path attribute解释的。
具体来说:
“目前,出于安全原因,URL 必须与 JAR 文件的代码库相关。因此,远程可选包将源自与应用程序相同的代码库。”
“每个相关的 URL 都是针对从中加载包含应用程序或库的代码库解析的。如果生成的 URL 无效或引用无法找到的资源,则将其忽略。”
因此,如果manifest.jar
的MANIFEST.MF
文件中的Class-Path
属性使用绝对 URL,或以“/”开头的 URL,或者如果它们不相对于manifest.jar
本身的位置进行解析,则相应的 JARs,等不会被添加到内部类路径。 他们被默默地忽略了。
如果您只是将manifest.jar
复制到您的项目中,就会发生这种情况......
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.