« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | | | | |
| 公告 |
不得窥道门,不得悟佛门,不得入窄门,实乃破门。 |
Blog信息 |
blog名称:破门点滴 日志总数:161 评论数量:404 留言数量:-2 访问次数:1421205 建立时间:2004年11月13日 |

| |
[开发笔记]Triones Runtime: 如何避免setURLStreamHandlerFactory调用失败? 心得体会, 软件技术 破门 发表于 2004/12/24 18:56:54 |
果然,发现Tomcat已经调用了此方法:org.apache.catalina.loader.WebappLoader
// Register a stream handler factory for the JNDI protocol
URLStreamHandlerFactory streamHandlerFactory =
new DirContextURLStreamHandlerFactory();
if (first) {
first = false;
try {
URL.setURLStreamHandlerFactory(streamHandlerFactory);
} catch (Exception e) {
// Log and continue anyway, this is not critical
log.error("Error registering jndi stream handler", e);
} catch (Throwable t) {
// This is likely a dual registration
log.info("Dual registration of jndi stream handler: "
+ t.getMessage());
}
}
尝试将Eclipse 中OSGi的Framework对象进行更改:
org.eclipse.osgi.framework.internal.core.Framework
initialize() 方法,跳过二次注册 setURLStreamHandlerFactory的错误:
/* install URLStreamHandlerFactory */
try{
URL.setURLStreamHandlerFactory(new
StreamHandlerFactory(systemBundle.context, adaptor));
} catch (Throwable t) {
// This is likely a dual registration
if (Debug.DEBUG && Debug.DEBUG_GENERAL)
System.out.println("Dual registration of jndi stream handler: "
+ t.getMessage());
}
运行出现错误,Eclipse无法加载插件:
java.net.MalformedURLException: unknown protocol: reference
at java.net.URL.<init>(Unknown Source)
at org.eclipse.core.runtime.adaptor.EclipseStarter.searchForBundle(EclipseStarter.java:366)
at org.eclipse.core.runtime.adaptor.EclipseStarter.getInitialBundles(EclipseStarter.java:466)
at org.eclipse.core.runtime.adaptor.EclipseStarter.loadBasicBundles(EclipseStarter.java:418)
at org.eclipse.core.runtime.adaptor.EclipseStarter.startup(EclipseStarter.java:222)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.softme.triones.launcher.TrionesInvokeStarter.basicRun(TrionesInvokeStarter.java:342)
at org.softme.triones.launcher.TrionesInvokeStarter.launch(TrionesInvokeStarter.java:899)
at org.softme.triones.TrionesContextListener.
只能先研究以上参考中更新protocol注册的第二种或第三种方法了。
Eclipse采用了URLStreamHandlerProxy的代理机制来处理,实际的服务定义在OSGi的service org.osgi.service.url. URLStreamHandlerService实现中。解决了Java JVM 对URLStreamHandler 进行缓存而不能支持动态加载的问题。
因此,看来不能够去掉Eclipse中对URL. setURLStreamHandlerFactory的调用。
解决办法呢?………………………………………….????????????????????????
讨论:
方案一:在JVM 的URL 协议注册机制中寻求其他入口点。
困难度 100%:JVM协议注册的第二种和第三种方法都无法支持Eclipse的入口。
因为Eclipse通过对Factory的扩展支持了协议处理器(Handler)的动态加载,以及嵌入了OSGi服务机制,所以无法采取其他入口实现Eclipse加载机制。
方案二:修改Eclipse框架,避开 setURLStreamHandlerFactory的调用。
困难度 100%:原因同上。
方案三:修改JRE中java.net.URL对象,允许多factory设置。
困难度 10%。 | |
|