如果它使用类加载器,我如何检测OSGi包的运行时库?

时间:2015-01-03 16:11:23

标签: java runtime osgi classloader karaf

我正在尝试将复杂的应用程序(jForexAPi,DDS2)放入OSGi包中。我创建了两个包含嵌入式依赖项的包,包括编译时和运行时(传递)。所以我在.jar包中包含了.class-es。

当我尝试使用时,我得到了ClassNotFoundException,因为DDS2实现在运行时通过其线程的类加载器加载类。不知怎的,这样:

           Class e = Thread.currentThread().getContextClassLoader().loadClass("com.dukascopy.charts.main.DDSChartsControllerImpl");

我有两个问题:

  1. 如何确定karaf中线程的父包?
  2. 如何解决OSGi中运行时类加载等问题?有没有办法允许或发现运行时类加载?

1 个答案:

答案 0 :(得分:2)

  

如何在karaf中确定线程的父包?

你做不到。线程没有父包。如果您指的是Thread上下文类加载器,则OSGi中根本没有定义它。 TCC通常是Java EE世界中webapp的类加载器。但是,在OSGi中它甚至可以是null或任何东西。它应该永远不会被使用。

  

如何在OSGi中解决运行时类加载等问题?有没有办法允许或发现运行时类加载?

你可以做两件事:

  • 参与项目以允许配置将用于加载这些类的类加载器
  • 实现变通方法:分析ClassNotFoundException的堆栈跟踪并找到可以设置线程上下文类加载器的位置

如果您选择了第二个选项,您的代码将类似于以下内容:

Thread currentThread = Thread.currentThread();
ClassLoader previousCL = currentThread.getContextClassLoader();
try {
    currentThread.setContextClassLoader(DDSChartsControllerImpl.class.getClassLoader());
    callNextFunctionOnStacktrace();
} finally {
    // You should set the original CL back as other technology might use the TCC tricks, too
    currentThread.setContextClassLoader(previousCL);
}