在动态加载的类中执行带有依赖项的java方法

时间:2011-04-06 19:49:22

标签: java plugins dependencies classloader

我的jar文件有自己的库,就像任何其他netbeans项目一样。另外,我有一个“plugins”文件夹来存储.jar文件格式的插件。我正在使用URLClassLoader加载插件,我也正在执行正确的方法而没有任何问题。

但是,plugins文件夹中的jar文件可能包含不在我的类路径中的其他软件包(例如java-mail)的依赖项(plugins文件夹也不在我的类路径中),所以我是担心该插件是否会被正确执行。我也不知道应该在哪里存储这种依赖。

我可以采取措施克服这个问题吗?我应该在哪里存储插件依赖项?

感谢。

2 个答案:

答案 0 :(得分:0)

  

ClassLoader类使用委派模型来搜索类和资源。 ClassLoader的每个实例都有一个关联的父类加载器。当请求查找类或资源时,ClassLoader实例会在尝试查找类或资源本身之前,将对类或资源的搜索委托给其父类加载器。虚拟机的内置类加载器,称为“引导类加载器”,本身不具有父级,但可以作为ClassLoader实例的父级。

(来自ClassLoader)的javadoc

上面的段落意味着通常情况下,您的类加载器会形成一个树,并且每个人在尝试加载类之前都会询问其父。所以从理论上讲,如果您的依赖项是由加载插件的类加载器或任何上游类加载器可见的,那么它将起作用。

但是,有两点需要注意:

  1. 如果你的插件调用Thread.setContextClassLoader(),那可能会搞砸了。但这应该是插件作者关心的问题,而不是你的问题。
  2. Web服务器通常不遵守此委派规则,以确保不同Web应用程序与服务器本身之间的最大分离。
  3. (如果有一些我可以看到的代码,我可能会给出一个不太通用的答案。)

答案 1 :(得分:0)

根据biziclop,我已将依赖项放在插件文件夹中。它似乎工作,但我需要下载额外的包。

为了澄清,我使用apache httpClient库创建了一个插件。我制作了jar文件,然后我把jar文件及其依赖项(httpClient和httpCore)放在plugin文件夹中。当我执行插件时出现“NoClassDefFoundError”。为了解决这个问题,我下载了“commons-logging”和“servlet”软件包,并将它们添加到插件文件夹中。

至少,这不是我的问题,因为插件开发人员应该测试插件并提供那些额外的包,但事实是这些额外的包在测试插件时公布,而不是在编译时。

感谢您的帮助!