我试图将一个复杂的应用程序(jForexAPi,DDS2)放入OSGi包中 . 我创建了两个包含嵌入式依赖项的包,包括编译时和运行时(传递) . 所以我在.jar包中有.class-es包 .
当我尝试使用时,我得到了ClassNotFoundException,因为DDS2实现在运行时通过其线程的类加载器加载类 . 不知何故这样:
Class e = Thread.currentThread().getContextClassLoader().loadClass("com.dukascopy.charts.main.DDSChartsControllerImpl");
我有两个问题:
-
如何确定karaf中线程的父包?
-
如何解决OSGi中运行时类加载等问题?有没有办法允许或发现运行时类加载?
1 回答
你不能 . 线程没有父包 . 如果您指的是Thread上下文类加载器,则OSGi中根本没有定义它 . TCC通常是Java EE世界中webapp的类加载器 . 但是,在OSGi中它甚至可以是null或任何东西 . 应该永远不要使用它 .
你可以做两件事:
为项目提供参考,以允许配置将用于加载这些类的类加载器
实现变通方法:分析ClassNotFoundException的堆栈跟踪并找到可以设置线程上下文类加载器的位置
如果您选择第二个选项,您的代码将类似于以下内容: