【发布时间】:2014-04-20 05:46:42
【问题描述】:
我在互联网上找到了以下 OSGi 的加载器结构。
引导类加载器(来自 jre/lib/rt.jar 的 Java 标准库 等)
^
扩展类加载器
^
系统 类加载器(即 $CLASSPATH 上的东西,OSGi 核心代码)
^ (** 限制从父类加载器访问类型
common OSGi 类加载器:
--|-- 用于 bundle1 的 OSGi 类加载器->(导入包的映射->类加载器)
--|-- 用于 bundle2 的 OSGi 类加载器->(导入包的映射->类加载器)
--|-- bundle3 的 OSGi 类加载器 -> (imported-package->classloader 的映射)
Here 上面写着
在执行线程上设置的上下文类加载器。默认情况下是 始终设置为 System classloader 或从新的线程 线程实例已创建。
从上面的结构中我们看到系统加载器(=上下文加载器)具有更高的位置,据我所知,父类加载器从不询问它的子类。
所以我的问题请解释当前线程如何与当前包中的类一起工作?
【问题讨论】:
-
在 OSGI
Thread.currentThread().getContextClassLoader()返回一个特殊的 OSGI 捆绑类加载器。在 Equinox 中,它是org.eclipse.osgi.framework.internal.core.BundleClassLoader。这个类加载器由 OSGI 容器设置,只知道MANIFEST.MF中Bundle-ClassPath定义的导入包和类(默认是.=> 包本身) -
@drkunibar 我不了解 Equinox,但在 felix 中,Thread.currentThread().getContextClassLoader() 返回 sun.misc.Launcher$AppClassLoader@2f0f94a0,this.getClass().getClassLoader 返回 org .apache.felix.framework.BundleWiringImpl@51dd475f。您的解释似乎有问题。
-
您可以在 OSGi 核心规范中找到有关 OSGi 中类加载器的所有信息。 servlet 容器经常使用线程上下文类加载器。调用Web应用程序时,将Web应用程序的类加载器设置为线程上下文类加载器。技术开发人员通常使用线程上下文类加载器来确保他们看到 webapp 中可用的所有类。在 OSGi 中,你永远不应该依赖线程上下文类加载器,也不应该使用依赖于线程上下文类加载器的技术。
-
@P82 我对felix一无所知,但是
Thread.currentThread().getContextClassLoader()返回的类加载器可以和this.getClass().getClassLoader不同,因为第一个可以改(第二个不能改)。如果您考虑在 OSGI 中加载类,您应该阅读此博客:blog.osgi.org/2011/05/what-you-should-know-about-class.html -
上面cmets中有些信息是假的。在 OSGi 中,线程上下文类加载器只是 undefined。你不能断言或期望它是特定的东西,事实上它可能是空的。
标签: java multithreading jakarta-ee osgi