在运行时将jar添加到Eclipse插件

Mar*_*ria 7 java eclipse eclipse-plugin

我正在研究一个Eclipse插件,它需要在编译时不知道的类.这些类通过jar文件在网络上发送.我想在运行时动态加载这些类.

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

不幸的是,它没有达到预期的效果.当类被加载时,我不能在我加载它们的函数之外使用它们.我猜这与使用不同的类加载器有关.

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

And*_*fer 5

如果你将这些jar放入OSGi包中(即给它们一个MANIFEST.MF),那么你可以动态地将它们安装到OSGi运行时.

如果您将插件激活器添加到插件中,则可以存储org.osgi.framework.BundleContext,然后您可以执行以下操作:

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

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

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

(Class.forName如果您的插件具有依赖性,新插件解析后将满足这些插件),您的插件代码中的(EDIT类加载) 将只能在新安装的包中找到类.

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

另一种选择是Bundle.loadClass在新安装的bundle的bundle对象上使用(而不是Class.forName).这使用了新bundle的类加载器,因此你的插件本身不需要依赖新的bundle.