【问题标题】:Loading user code in java application在 Java 应用程序中加载用户代码
【发布时间】:2017-01-15 16:01:21
【问题描述】:

我希望允许用户为我的应用程序编写他们自己的插件。用法很简单,在应用程序启动后,它会在某个文件系统路径中搜索 jar 文件并加载所有这些文件。所有 jar 都依赖于我向客户发布的 PluginFramework。

现在,问题:

  1. 是否可以在插件的 jar Manifest 文件中添加 PluginFramework 版本并通过代码进行验证?
  2. 如果某些插件共享相同的类名(当然还有包),我可以将它们加载到同一个类加载器中,还是需要为每个插件创建不同的类加载器?
  3. 插件类(由自定义类加载器加载)能否访问主类加载器加载的类? PluginFramework 类应在所有插件之间共享。
  4. 有没有办法卸载由特定类加载器加载的所有类?

谢谢。

【问题讨论】:

  • 听起来像是 OSGi 的工作 - 也许您应该先阅读一些关于此的内容。不是为了开发一些自制解决方案,而是为了坚持众所周知的标准?您可以在 OSGi 中完成所有这些事情。
  • 然而,使用 OSGi 是一件很痛苦的事情,因为您通常只想从某个地方加载一些额外的 jar。
  • @KonradSzałkowski 谢谢,我会阅读有关 OSGi 的信息,看看它是否适合我的需求
  • @KonradSzałkowski 确实使用 OSGi 要求在容器内运行我的应用程序,或者它可以是我刚刚添加到我的类路径中的某个库吗?

标签: java plugins classloader


【解决方案1】:

我之前写过一个小插件系统。所以我会回答你的一些问题。

  1. 不知道,我想是的。

  2. 如果插件使用完全相同的包,您将需要一个单独的类加载器。我没有这样做,因为 jar 的名称决定了包,所以它们会自动唯一(不能将两个同名的 jar 放在一个文件夹中)

  3. 是的,他们可以。

  4. 是的,如果不再引用这些类和类加载器,它将获得 GC,请参阅:Unloading classes in java?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多