1

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

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

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

我有两个问题:

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

1 回答 1

2

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

你不能。线程没有父捆绑包。如果您指的是 Thread 上下文类加载器,那么它在 OSGi 中根本没有定义。TCC 通常是 Java EE 世界中 webapp 的类加载器。但是,在 OSGi 中,它甚至可以为 null 或任何值。它不应该被使用。

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

你可以做两件事:

  • 参与项目以允许配置将用于加载这些类的类加载器
  • 实现解决方法:分析ClassNotFoundException的stacktrace,找到可以设置线程上下文类加载器的地方

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

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);
}
于 2015-01-03T20:38:01.737 回答