【问题标题】:Java Maven OSGi dynamic loading of jar from filesystem and running a class method from it at runtimeJava Maven OSGi 从文件系统动态加载 jar 并在运行时从中运行类方法
【发布时间】:2017-11-21 07:06:31
【问题描述】:

我有一个 NetBeans OSGi maven 项目,它需要从另一个 OSGi jar 运行一个类方法,该 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?

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

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

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

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

提前感谢任何人帮助我不要把头发拉出来:)

【问题讨论】:

  • 我使用 NetBeans OSGI 已经有一段时间了,但现在手头没有 IDE。我记得您必须在 NetBeans 中将包添加为依赖项,然后您可以随意调用这些方法。但是你应该先导出需要的包。

标签: java maven netbeans jar osgi


【解决方案1】:

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

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

使用这个类加载器,您可以通过名称加载类并使用反射调用其上的方法。

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

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

【讨论】:

  • 当问题询问“我如何射中自己的脚”时,实际给出如何射中自己脚的说明可能并不总是一个好主意。
猜你喜欢
  • 2013-03-03
  • 2015-05-30
  • 2011-02-25
  • 2012-03-31
  • 2019-03-18
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
相关资源
最近更新 更多