Mar*_*ria 7 java eclipse eclipse-plugin
我正在研究一个Eclipse插件,它需要在编译时不知道的类.这些类通过jar文件在网络上发送.我想在运行时动态加载这些类.
我尝试过这里列出的方法:http://blog.imaginea.com/making-applications-work-together-in-eclipse/
不幸的是,它没有达到预期的效果.当类被加载时,我不能在我加载它们的函数之外使用它们.我猜这与使用不同的类加载器有关.
任何帮助表示赞赏.即使你告诉我,这是不可能的,所以我知道我不需要再看了.
如果你将这些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.
| 归档时间: |
|
| 查看次数: |
3426 次 |
| 最近记录: |