当前位置: 首页 > 知识库问答 >
问题:

在Jetty中使用系统类加载器加载外部jar

洪高阳
2023-03-14

我将Jetty(8和9)与LZ4压缩一起使用,我想使用LZ4的本机实现,它是C库的本机绑定。为了实现这一点,LZ4类应该用系统类加载器加载。

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

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

共有1个答案

诸俊才
2023-03-14

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

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

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

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

大约...

$ 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 扩展行为的弃用/替换以及几乎消除 System ClassLoader 的概念)

 类似资料:
  • 问题内容: 我们知道我们可以使用以下方法覆盖System 类加载器: 那么,既然它本身是一个类,它是由谁加载的? 我们如何获得该“元”类加载器的类文件? 问题答案: 从Javadoc中获取: 如果在首次调用此方法时定义了系统属性“ java.system.class.loader”,则该属性的值将作为要作为系统类加载器返回的类的名称。 该类使用默认的系统类加载器加载, 并且必须定义一个公共构造函数

  • 我试图在程序中加载一个jar文件来调用不同的方法。我有一个类来完成这项工作,但是该类使用加载jar文件,它依赖于系统类加载程序,因此,例如,如果加载的jar执行它完成整个应用程序的执行,终止当前运行的Java虚拟机。我的意图是,如果加载的jar最后一次这样做,它只完成jar,而不是整个应用程序。此外,我希望能够关闭jar,以便在需要时可以稍后重新启动它。我使用以下代码从jar实例化所需的类,并从我

  • 我有一个插件文件夹,其中包含一些JAR,我想加载它们的所有*。班我看到很多关于或的答案。然而,我想用java来实现这一点。nio包而不是io。 我能做的是: 使用 我还不能做的事: 使用NIO在JAR/ZIP中列出文件 最终,我想要: 在几个JAR中遍历每个类,并加载它们以寻找一种插件系统的注释 我应该补充一点,我不需要一个使用像番石榴或阿帕奇这样的应用编程接口的工作解决方案,但我只想知道它是如何

  • 主要内容:JVM架构图,1.类加载子系统作用,2.类加载器分类,3.双亲委派机制,4. 沙箱安全机制,5.其他JVM架构图 1.类加载子系统作用 类加载子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识; ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 加载的类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是

  • 如果我有一个内部类声明,例如: 其次是: A$B内部类也会加载吗?如果B内部类没有被声明为“静态”呢?

  • 问题内容: 我正在使用JDK 1.6运行小型应用程序。但是,我设置了一个非常庞大的类路径,其中包含很多类。 当我运行该应用程序时,即使没有在我的应用程序中实际使用它们,类加载器中的所有类也会被加载吗?如果不是,如何强制类加载器这样做,如果是,如何避免呢?谢谢! 例如,我正在使用ant 1.7运行我的应用程序。 最好的问候,罗伯特·吉 问题答案: 不,当在内存中需要类时,ClassLoader会加载