首页 文章

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

提问于
浏览
1

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

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

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

我有两个问题:

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

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

1 回答

  • 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);
    }
    

相关问题