Java Maven OSGi 在运行时从文件系统动态加载 jar 和 运行 class 方法

Java Maven OSGi dynamic loading of jar from filesystem and running a class method from it at runtime

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

我尝试查看其中一些类似的问题:

  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?

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

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

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

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

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

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

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

使用此 classloader,您可以按名称加载 class 并使用反射调用它的方法。

另请考虑,这不是适合 OSGi 的架构。如果您在编译时已经知道另一个包和 class,那么只需使用 Import-Package 并使用 new 实例化另一个 class。

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