Java Maven OSGi从文件系统动态加载jar并在运行时从它运行类方法

时间:2017-06-19 07:06:16

标签: java maven netbeans jar osgi

我有一个NetBeans OSGi maven项目,需要从运行时从文件系统加载的另一个OSGi jar运行一个类方法。

我试着看一些类似的问题:

  1. Dynamic loading of modules in Java

  2. Loading of OSGi bundle dynamically from a file system

  3. Looking for basic example of using Apache Felix in dynamic loading of Jar file and instancing a class at runtime in Java

  4. java: is there a framework that allows dynamically loading and unloading of jars (but not osgi)?

  5. How to dynamically load Java classes at Runtime in OSGI framework?

  6. 但是他们似乎没有回答我如何访问我正在加载的包中的方法。

    他们确实给我一个关于如何加载捆绑包的好方向,但OSGi上的文档也是如此。我没有找到的是如何从我安装的软件包中的特定类运行特定方法。反射似乎不起作用,我读过它可能不是一个好主意,无论如何它给了我着名的ClassNotFoundException。

    还有整个Manifest导入和导出,如此问题和其他问题所示 OSGi: programmitically add imports to a bundle

    我不能使用bndtools,因为我使用netbeans,我也不确定它是否能完成这项工作。我也不确定OSGi服务是否与它有任何关系。

    提前感谢任何帮助我不要拔头发的人:)

1 个答案:

答案 0 :(得分:3)

所以我假设你已经加载并启动了捆绑包。下一步是获取捆绑包的类加载器:

ClassLoader loader = bundle.adapt(BundleWiring.class).getClassLoader();

使用这个类加载器,你可以按名称加载类,并使用反射来调用它上面的方法。

请同时考虑这对OSGi来说不是一个好的架构。如果您已经在编译时知道另一个bundle和类,那么只需使用Import-Package并使用new实例化另一个类。

如果您在运行时不知道其他bundle和类但是可以控制所有bundle源,那么请使用服务方法。您可以拥有捆绑包共享的公共接口。另一个bundle可以将其功能作为OSGi服务提供,然后您可以使用共享接口绑定和访问它。