【问题标题】:Running class in separate context在单独的上下文中运行类
【发布时间】:2011-06-16 07:30:25
【问题描述】:

我正在尝试制作一个在运行时加载和运行一些类的简单应用程序。例如,假设我有这个配置:

module1.classpath=module1.jar,somelibs1.jar
module1.class=com.blabla.Module1
module2.classpath=module2.jar,somelibs2.jar
module2.class=com.blabla.Module2

然后我需要加载module1.classpath 中指定的库并在加载该库的情况下运行module1.class。之后我需要加载module2.classpath 并使用这些库运行module2.class。

somelibs1.jarsomelibs2.jar 内部有相同的类时,我该如何处理?基本上我想运行module1.jar 专门使用somelibs1.jarmodule2.jar 专门使用somelibs2.jar。我该如何实现?

我猜我需要为我的每个类创建一个单独的类加载器,并将 jar 推送到该类加载器中。不过,我会很感激一些例子,或者至少是确认这是一种正确的做法。

【问题讨论】:

    标签: java plugins classloader


    【解决方案1】:

    这似乎是OSGI 的一个很好的用例。我建议为此使用 OSGI,因为您需要的一切都是由 OSGI 开箱即用提供的。

    但是如果由于某种原因您不能使用 OSGI,那么您需要做的是为每个模块设置一个类加载器。通过 ClassLoaderX 加载 moduleX.class,moduleX.classpath 应该添加到 ClassLoaderX 的路径中。您可以为此使用一组简单的 URLClassLoader。

    【讨论】:

    • 谢谢,我认为这完全涵盖了问题。还要特别感谢提到 OSGI,现在我知道它存在并阅读它:D
    【解决方案2】:

    感谢您的提问。很有趣。

    您似乎不能在一个 JVM 实例中使用同一类的多个版本。我从来没有做过这个任务,也不知道怎么实现。

    但是让我们玩吧。我不知道您开发的异国应用程序是什么。可能你可以运行多个 JVM,每个 JVM 都会有专属的 CLASSPATH。

    编写可以运行(例如使用Runtime.exec())另一个JVM并通过某个渠道(可能是网络)与其进行对话的应用程序。

    【讨论】:

    • 将其加载到单独的 JVM 中会占用太多资源。 Suraj Chandran 提出的方法要好得多,因为它允许使用单独的类加载器将所有内容加载到一个 JVM 中。
    • 嗯。或许。但是您可以检查 OSGi 是如何工作的。这是一个非常繁重的解决方案。好吧,您的决定就是您的决定:-)。祝你好运!
    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 2022-11-01
    • 2018-08-17
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    相关资源
    最近更新 更多