Posted on 2005-09-09 14:30
ravenix 阅读(1256)
评论(1) 编辑 收藏 所属分类:
eclipse插件开发
Eclipse 应用可以使用Java Web Start部署,实现Rich Client。
这要求把所有的插件打包成独立的jar,并且要签署它。
如果要用到别人开发的java库,就要利用eclipse提供的Create a plug-in project from existing JAR archives 把它做成 eclipse plugin。
Apache
Jakarta有许多项目使用了commons-logging来写log。如果用到了这样的项目,你也需要把commons-logging做成一个
plugin。但是commons-logging在使用eclispe plugin包装并使用Java Web Start部署时,它会抛出异常
LogConfigurationException
: Invalid class loader hierarchy. You have more than one version of
org.apache.commons.logging.Log visible, which is not allowed.
究其原因,是JCL(Jakarta Commons Logging)中一直存在的classloader问题。
简单来说,JCL使用调用者的classloader加载Log接口,这是最常见的类载入方法;但是加载具体的实现类是,用的是thread context classloader。
通常情况下,这两个classloader是同一个。但是Eclipse有一套插件类加载机制,每个插件使用不同的
classloader。在这个例子中,加载Log接口是EclipseClassLoader,加载Log实现类的thread context
classloader是JNLPClassLoader,它们并不相同。问题就来了,用不同classloader加载的类被认为是无关的,所以JCL
的实现类不能赋给Log接口类,就会抛出那个异常。
关于JCL classloader问题更详细解释,请看log4j的创始人之一,Ceki Gülcü写的文章
"Taxonomy of class loader problems encountered when using Jakarta Commons Logging"
为了解决这个问题,我启动了一个项目,jcleclipse -- 重写了JCL,固定实现为把所有的log写到eclipse自己的ILog里。这样就不用要求用户在某个指定的地方建目录来存储log。
jcleclipse项目主页 http://jcleclipse.sourceforge.net/
jcleclipse项目概要 http://sourceforge.net/projects/jcleclipse