我正在使用 Jetty(8 和 9)以及LZ4 压缩,我想使用 LZ4 的本机实现,它是与 C 库的本机绑定。为此,应使用系统类加载器加载 LZ4 类。
所以我的问题是,如何使用 Jetty 中的系统类加载器加载外部 jar。
将 lib 放入 $jetty.home/lib/ext 并没有帮助,因为它是使用扩展类加载器而不是系统加载器加载的。
我正在使用 Jetty(8 和 9)以及LZ4 压缩,我想使用 LZ4 的本机实现,它是与 C 库的本机绑定。为此,应使用系统类加载器加载 LZ4 类。
所以我的问题是,如何使用 Jetty 中的系统类加载器加载外部 jar。
将 lib 放入 $jetty.home/lib/ext 并没有帮助,因为它是使用扩展类加载器而不是系统加载器加载的。
当 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 扩展行为的弃用/替换以及几乎消除系统类加载器)