[讨论] Classloader问题

iwinit 2012-12-11
一个线程调用另一个classlaoder A加载并暴露的类的时候,碰到一个新的类,会用classloader A来加载吧?虽然contextClassloader没有修改
moshalanye 2012-12-11
这个问题完全没问清楚.
1.classlaoder A 如何加载,给个代码先。
2.contextClassloader,跟你classloaderA有无关系?

iwinit 2012-12-11
哈哈,我错了。在补充下,我是jboss容器启动的时候去调用OSGI容器的类,正好这个类的方法里又引入了另一个类。classloader A就是OSGI的classloader哈,这里的context classLoader是jboss的classloader。OSGI容器启动的时候有一个ClassLoaderDelegateHook放jboss的classloader,这样OSGI容器可以访问jboss容器里的类,同时OSGI容器会export一些类放入jboss的classloader repository,这样jboss里也可以访问部分OSGI的类。
for (String className : exportedClasses.keySet()) {
            jbossRepo.cacheLoadedClass(className, exportedClasses.get(className), jbossClassloader);
        }
moshalanye 2012-12-12
OSGI 启动,注册服务,与被注册的服务被调用时,应该是完全不同的classloader。

OSGI启动时,装载类是把装载行为 委派给 每个boundle对应的Module CL。

而OSGI Service被调用运行时,并不是使用OSGI的classloader。
而是正常使用contextClassloader -->往往是JVM启动的APP classLoader。

这就是为什么OSGI在运行时,总是会被涉及修改contextClassloader来解决问题的原因。

现在高版本的开源中,都提供了 loadResource(String sourcePath,ClassLoader cl)的方法。来解决contextClassloader无法获取资源的问题。

所以你需要解决得问题:
可以搞清楚,Thread中contextClassloader是什么,debug下就知道了。

如果像你说的
“OSGI容器会export一些类放入jboss的classloader repository”

那么就是该Class在哪边的Path下,哪边搞定。
Global site tag (gtag.js) - Google Analytics