如果 OSGi 包使用类加载器,我如何检测它的运行时库?
How can I detect runtime libraries of an OSGi bundle if it uses classloader?
我正在尝试将一个复杂的应用程序(jForexAPI、DDS2)放入 OSGi 包中。我制作了两个具有嵌入式依赖项的包,包括编译时和运行时(传递)。所以我在 .jar 包中有 .class-es 包。
当我尝试使用时,我得到了 ClassNotFoundException,因为 DDS2 实现在运行时通过其线程的 classloader 加载 class。有点像这样:
Class e = Thread.currentThread().getContextClassLoader().loadClass("com.dukascopy.charts.main.DDSChartsControllerImpl");
我有两个问题:
- 如何确定 karaf 中线程的父包?
- 如何解决 OSGi 中的运行时 class加载等问题?有没有办法允许或发现运行时 class 负载?
How can I determine the parent bundle of a thread in karaf?
你不能。线程没有父束。如果您指的是 Thread 上下文类加载器,那么它在 OSGi 中根本没有定义。 TCC 通常是 Java EE 世界中 webapp 的类加载器。但是,在 OSGi 中,它甚至可以为 null 或任何内容。永远不要使用它。
How can I solve issues like runtime classloads in OSGi? Is there a way to allow or discover runtime classloads?
你可以做两件事:
- 为项目做出贡献以允许配置将用于加载这些的类加载器类
- 实施解决方法:分析 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);
}
我正在尝试将一个复杂的应用程序(jForexAPI、DDS2)放入 OSGi 包中。我制作了两个具有嵌入式依赖项的包,包括编译时和运行时(传递)。所以我在 .jar 包中有 .class-es 包。
当我尝试使用时,我得到了 ClassNotFoundException,因为 DDS2 实现在运行时通过其线程的 classloader 加载 class。有点像这样:
Class e = Thread.currentThread().getContextClassLoader().loadClass("com.dukascopy.charts.main.DDSChartsControllerImpl");
我有两个问题:
- 如何确定 karaf 中线程的父包?
- 如何解决 OSGi 中的运行时 class加载等问题?有没有办法允许或发现运行时 class 负载?
How can I determine the parent bundle of a thread in karaf?
你不能。线程没有父束。如果您指的是 Thread 上下文类加载器,那么它在 OSGi 中根本没有定义。 TCC 通常是 Java EE 世界中 webapp 的类加载器。但是,在 OSGi 中,它甚至可以为 null 或任何内容。永远不要使用它。
How can I solve issues like runtime classloads in OSGi? Is there a way to allow or discover runtime classloads?
你可以做两件事:
- 为项目做出贡献以允许配置将用于加载这些的类加载器类
- 实施解决方法:分析 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);
}