【问题标题】:Load external jar with system class loader in Jetty在 Jetty 中使用系统类加载器加载外部 jar
【发布时间】:2017-12-09 00:44:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: java jetty classloader lz4


    【解决方案1】:

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

    系统类加载器基本上只用于保存与 JVM(以及可选的 XBootClasspath 和 JVM 扩展)相关的 jar。

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

    也许您的 LZ4 压缩 jar 需要通过 JVM 的各种扩展机制加载,然后 Jetty 才参与 ClassLoaders。

    类似...

    $ 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 扩展行为的弃用/替换和几乎消除系统类加载器的概念)

    【讨论】:

    • 这里的术语不太对。系统(或应用程序类加载器)用于加载类路径或模块路径上的应用程序类。它是加载核心类(如 java.lang.Object)的引导加载程序。我不知道您所说的“几乎消除...”是什么意思-我怀疑您的意思是引导类路径的概念在 JDK 9 中大部分已被删除。有关此主题的所有详细信息都在 JEP 261 中。
    • Java 9 中的类加载器行为非常不同。考虑一下:引导类、扩展、非 UrlClassLoader,甚至基于目标平台 (JEP 238) 选择的类都会影响这个特定问题中的 OP。
    猜你喜欢
    • 2015-01-04
    • 1970-01-01
    • 2020-12-17
    • 2012-07-08
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    相关资源
    最近更新 更多