2011-01-28 70 views
7

我正在研究需要在编译时不知道的类的Eclipse插件。这些类以jar文件的形式通过网络发送。我想在运行时动态加载这些类。在运行时将jar添加到Eclipse插件

我试图在这里列出的方法:http://blog.imaginea.com/making-applications-work-together-in-eclipse/

遗憾的是它并没有收到预期的效果。虽然这些类确实被加载了,但是我不能在我加载它们的函数之外使用它们。我猜测它与使用不同的类加载器有关。

任何帮助表示赞赏。即使你告诉我,这是不可能的,所以我知道我不必再看了。

回答

5

如果你让那些罐子到OSGi包(即,给他们一个MANIFEST.MF),那么你可以动态地将它们安装到OSGi运行时。

如果添加一个包激活你的插件,那么你可以存储org.osgi.framework.BundleContext,然后你可以这样做:

Bundle [] newBundle = new Bundle[] { bundleContext.install(location, newJarInputStream) }; 
    packageAdmin.refreshPackages(newBundle); 
    packageAdmin.resolveBundles(newBundle); 

packageAdmin是org.osgi.service的一个实例。 packageAdmin.PackageAdmin这是您可以获得的服务BundleContext#getService

新罐子可以是完整的捆绑包,也可以是以您的插件作为其主机的捆绑包碎片。如果它们是你的包的片段,那么你的包(BundleContext#getBundle())将需要包含在传递给refreshPackages和resolveBundles的数组中。

(编辑类加载) Class.forName从你的插件代码只能找到新安装的包类,如果你的插件有一个将被新的包来满足一旦被解析的依赖。

  • 一种方法可以在插件的清单中选择Import-Package。在这种情况下,您的插件将需要包含在传递给refreshPackages的数组中。
  • 另一种选择是在插件清单中使用DynamicImport-Package语句。动态导入可在类加载期间解决

另一个选项是对捆绑对象使用Bundle.loadClass(而不是Class.forName)用于新安装的捆绑软件。这使用了新的bundle的类加载器,所以你的插件本身不需要依赖新的bundle。

+0

这听起来像是正确的做法(+1) – 2011-01-28 16:13:51

1

我最近做这一个插件到Eclipse:

这里是突出的代码

URL[] urls = new URL[]{ new URL("jar", "", "file:" + jarFile.getAbsolutePath() + "!/")}; 
URLClassLoader cl = URLClassLoader.newInstance(urls, this.getClass().getClassLoader()); 
Class<?> loadedClass = cl.loadClass("com.whatever.SomeClass"); 
相关问题