在单独的上下文中运行类

时间:2011-06-16 07:30:25

标签: java plugins classloader

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

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.clas

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

我猜我需要为每个类创建一个单独的类加载器并推送该类加载器中的jar。但是,我很欣赏一些例子,或者至少确认这是一种正确的方法。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

感谢您的提问。非常有趣。

在一个JVM实例中,您似乎无法使用同一类的多个版本。我从来没有完成这项任务,我不知道如何实现这一目标。

但是让我们玩吧。我不知道你开发的是什么是异国情调的应用程序。也许你可以运行很多JVM,每个JVM都有独家的CLASSPATH。

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