繁体   English   中英

Weblogic - 为什么 Java ClassLoader 不从空清单 jar 中提到的 jars 加载类

[英]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时,类路径设置如下:

  • 环境变量 CLASSPATH 被完全忽略
  • -cp / -classpath开关被完全忽略
  • 您明确指定的 jar 的清单中的Class-Path条目,即somejar.jar被读取,按空格拆分,任何相对路径都相对于 jar 所在的目录解析,并用作类路径。
  • 任何其他 jar 文件中的 Class- 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-PathMain-Class属性在这里无关紧要。

我认为您所观察到的可能是由 JAR file spec section on the Class-Path attribute解释的。

具体来说:

“目前,出于安全原因,URL 必须与 JAR 文件的代码库相关。因此,远程可选包将源自与应用程序相同的代码库。”

“每个相关的 URL 都是针对从中加载包含应用程序或库的代码库解析的。如果生成的 URL 无效或引用无法找到的资源,则将其忽略。”

因此,如果manifest.jarMANIFEST.MF文件中的Class-Path属性使用绝对 URL,或以“/”开头的 URL,或者如果它们不相对于manifest.jar本身的位置进行解析,则相应的 JARs,等不会被添加到内部类路径。 他们被默默地忽略了。

如果您只是将manifest.jar复制到您的项目中,就会发生这种情况......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM