2

我正在从 c++ 启动线程并调用 Java。JVM 本身的类路径设置正确,所有必要的 jar 都传递给 -Djava.class.path。

为什么“上下文类加载器”会在新线程中为空?

我有这个场景:

ClassLoader cl = Thread.currentThread().getContextClassLoader(); // null on new threads
ClassLoader currCl = MyClass.class.getClassLoader();
ClassLoader jbossCl = org.jboss.remoting.InvocationResponse.class.getClassLoader();

在第一个线程中(它在 Eclipse 中显示为“main”),所有三个对象都是有效的并且包含类。在所有以下线程cl中为空。

对我来说没有任何意义,如果我将类加载到 JVM 中,它们应该对全局每个线程都可用,不是吗?由于某种原因,currCl 和 jbossCl 中的类数量也大不相同。第一个有〜600,另一个有> 1000

4

1 回答 1

6

我们遇到了同样的问题,这令人困惑。第一个线程可以加载类,但附加到 JVM 的本地线程不能。您的问题具有相同的解决方案: 服务加载器未找到服务提供者类,即使该类与 META-INF/services 位于同一个 JAR 文件中 版主可能希望将其标记为重复,但问题听起来非常不同。

从这个文档http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/invocation.html

“当一个线程连接到虚拟机时,上下文类加载器就是引导加载器。”

任何通过 AttachCurrentThread() 附加到 JVM 的本机线程都只能获得引导类加载器,甚至不能获得系统类加载器。除非您明确修复新线程的上下文类加载器,否则无法从新线程加载类。

这可以像这样完成:

java.lang.Thread.currentThread().setContextClassLoader(
    java.lang.ClassLoader.getSystemClassLoader()
);
于 2015-03-22T13:14:06.973 回答