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

在动态加载的类中使用依赖项执行java方法,java,plugins,dependencies,classloader,Java,Plugins,Dependencies,Classloader,与其他任何netbeans项目一样,我的jar文件有自己的libs。此外,我还有一个“plugins”文件夹以.jar文件格式存储插件。我正在使用URLClassLoader加载插件,并且执行正确的方法,没有任何问题 然而,plugins文件夹中的jar文件可能包含与我的类路径中不存在的其他包(例如java邮件)的依赖关系(plugins文件夹也不在我的类路径中),因此我担心插件是否会正确执行。我也不知道我应该把这种依赖存储在哪里 我能做些什么来克服这个问题吗?我应该在哪里存储插件依赖项 谢谢

与其他任何netbeans项目一样,我的jar文件有自己的libs。此外,我还有一个“plugins”文件夹以.jar文件格式存储插件。我正在使用URLClassLoader加载插件,并且执行正确的方法,没有任何问题

然而,plugins文件夹中的jar文件可能包含与我的类路径中不存在的其他包(例如java邮件)的依赖关系(plugins文件夹也不在我的类路径中),因此我担心插件是否会正确执行。我也不知道我应该把这种依赖存储在哪里

我能做些什么来克服这个问题吗?我应该在哪里存储插件依赖项

谢谢

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

(来自
类加载器的javadoc

上面的段落意味着,通常情况下,类装入器会形成一棵树,每个装入器在尝试装入类之前都会询问其父级。因此,理论上,如果您的依赖关系可以通过加载插件的类加载器或任何上游类加载器看到,那么它将起作用

但是,有两个注意事项:

  • 如果你的插件调用,可能会把事情搞砸。但这更应该是插件作者的关注点,而不是你的
  • Web服务器通常不遵守此委派规则,以确保不同Web应用程序与服务器本身之间的最大分离

  • (如果有一些代码可以看的话,我可能会给出一个不太一般的答案。)

    根据biziclop的说法,我已经将依赖项放在插件文件夹中了。这似乎是可行的,但我需要下载额外的软件包

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

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

    谢谢你的帮助