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

类加载器类依赖关系(插件)

马宜民
2023-03-14

我想问一下URLClassLoader。我写了一篇主要的文章。运行良好的jar文件。现在我想让它能够从它的一个文件夹加载插件。我写了它,直到它找到了答案。jar文件在文件夹中,可以在其中列出它们的类(它们的名称、路径)。问题是,当我要求他查找该类(用于创建它的实例)时,他们找不到它从我的主jar文件继承的类,如下所示:

IN MAIN JAR:
-class Expansion { ... }

In a plugin jar:
-class ExpansionA extends MainJar.Expansion { ... }

因此,当我要求UrlClassLoader解析“ExpansionA”类时,它将在插件jar中搜索“Expansion”类而不是MainJar,插件jar中没有“Expansion”类,因为它作为资源库从MainJar继承。。。并在defineClass方法运行时引发NoDefFoundForClassError异常。我怎么能告诉他在MainJar上完课后也要检查呢?(这不仅仅是一个类,我希望插件能够从MainJar继承任何类)。你能帮我吗?

共有1个答案

苍兴怀
2023-03-14

ClassLoaders有一个加载请求首先委托给的父级。为了确保您正在创建的新类加载器可以访问类扩展,您应该将新类加载器的父类设置为类扩展类加载器

ClassLoader myLoader=newURLClassLoader(URL,Expansion.class.getClassLoader())

这不仅可以确保扩展类将被myLoader找到,还可以保证它解析为相同的运行时类(首先询问父类)。如果插件jar包含类的副本,这一点很重要。

 类似资料:
  • 我是cucumber可扩展代码的新手,我需要帮助。我正在使用java 8和maven,并希望生成cucumber可扩展报告。但每次我得到以下错误: Pom.xml文件是: Runner类代码: 我得到这个错误:

  • 我试图让ESB系统使用ServiceMix和ActiveMQ运行。但甚至在我深入到这一点之前,我就有一个关于POM依赖类型的问题。我得到的maven依赖关系如下: 如能提供任何指导,不胜感激。这个ServiceMix由于缺乏文档而令人沮丧。

  • 我有一个Advision类,它使用了代理jar中的另一个类,但这个类依赖于代理jar中不存在的一个类。代理jar中不存在的这个类存在于应用程序类加载器上的另一个jar中。代理jar位于系统类加载器上。所以我没有遇到ClassDefounderRor。我已经尝试使用Transformer.forAdvise,这是在另一篇文章中建议的,但这只适用于Advise类。

  • 问题内容: 我一直在尝试建立一个自定义的类加载器,该类加载器将拦截类以打印出哪些类正在加载到应用程序中。类加载器看起来像这样 它只是吐出它加载的所有类的名称。但是,当我尝试运行一些代码时, 通过 它打印出来 这似乎很奇怪。这不是一个简单的类,它取决于程序包中的许多其他类。这些类显然正在加载中,因为d python代码能够执行操作并读取我的文件。但是,由于某些原因,那些类并未由load的类加载器加载

  • 故事:我使用JDK8和IVY作为ANT Builder的依赖项管理器。一切都很好。我的类能够找到依赖关系。 问题:现在我要打开JDK11,现在找不到依赖关系。 我需要的解决方案是:我需要OpenJDK11的常春藤依赖项来支持

  • 编写的PHP扩展需要需要依赖另外一个扩展,在PHP-X中可以调用Extension->require来实现。 PHPX_EXTENSION() { Extension *ext = new Extension("test", "0.0.1"); ext->require("swoole"); ext->require("sockets"); return ext;