0

我正在使用 Jetty(8 和 9)以及LZ4 压缩,我想使用 LZ4 的本机实现,它是与 C 库的本机绑定。为此,应使用系统类加载器加载 LZ4 类。

所以我的问题是,如何使用 Jetty 中的系统类加载器加载外部 jar。

将 lib 放入 $jetty.home/lib/ext 并没有帮助,因为它是使用扩展类加载器而不是系统加载器加载的。

4

1 回答 1

1

当 Jetty 启动时,它会实例化一个自定义 ClassLoader 以符合各种规范要求(JSP、CDI、OSGi、Java9 等)

System ClassLoader 基本上只存在用于保存 JVM(以及可选的 XBootClasspath 和 JVM 扩展)相关的 jar。

Jettylib/ext与 JVM 扩展机制无关,不要混淆这两个。

在 Jetty 参与 ClassLoaders 之前,您的 LZ4 压缩 jar 可能需要通过 JVM 的各种扩展机制加载。

就像是 ...

$ java <load_LZ4_jars_via_ext_stuff> -jar start.jar
# example
$ java -Djava.ext.dirs=/full/path/to/lz4.jar -jar start.jar

注意:Java 9 再次改变了一切,因此您现在学习的任何内容都将被遗忘,您将需要使用新的 Java 9 技术(请参阅JEP 220及其对 JVM 扩展行为的弃用/替换以及几乎消除系统类加载器)

于 2017-12-08T16:44:13.720 回答