[讨论] 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下,哪边搞定。 |
相关讨论
相关资源推荐
- ClassLoader
- fastjson classloader问题处理与原因分析
- Flink1.14提交任务报错classloader.check-leaked-classloader问题解决
- ClassLoader问题剖析
- 关于Android中自定义ClassLoader耗时问题的追查
- 解决XXX.dll already loaded in another classloader问题
- Java类加载器ClassLoader用法解析
- 深入理解ClassLoader工作机制.docx
- 详解Android类加载ClassLoader
- spring-boot-devtools 不同ClassLoader引起的问题