﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-ravenix-随笔分类-eclipse插件开发</title><link>http://www.blogjava.net/ravenix/category/2797.html</link><description>鱼如何控制自己的呼吸</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:52:16 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:52:16 GMT</pubDate><ttl>60</ttl><item><title>在Eclipse Java Web Start环境中使用commons-logging</title><link>http://www.blogjava.net/ravenix/archive/2005/09/09/12541.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Fri, 09 Sep 2005 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/09/09/12541.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/12541.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/09/09/12541.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/12541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/12541.html</trackback:ping><description><![CDATA[<p>Eclipse 应用可以使用Java Web Start部署，实现Rich Client。</p>
<p>这要求把所有的插件打包成独立的jar，并且要签署它。</p>
<p>如果要用到别人开发的java库，就要利用eclipse提供的Create a plug-in project from existing JAR archives 把它做成 eclipse plugin。<br>
</p>
<p>Apache
Jakarta有许多项目使用了commons-logging来写log。如果用到了这样的项目，你也需要把commons-logging做成一个
plugin。但是commons-logging在使用eclispe plugin包装并使用Java Web Start部署时，它会抛出异常</p>
<p style="border: thin solid ; margin: 16px; padding: 8px; background-color: rgb(204, 204, 204);">LogConfigurationException
: Invalid class loader hierarchy. You have more than one version of
org.apache.commons.logging.Log visible, which is not allowed.</p>
<p>究其原因，是JCL(Jakarta Commons Logging)中一直存在的classloader问题。
</p>
<p>简单来说，JCL使用调用者的classloader加载Log接口，这是最常见的类载入方法；但是加载具体的实现类是，用的是thread context classloader。<br>
</p>
<p>通常情况下，这两个classloader是同一个。但是Eclipse有一套插件类加载机制，每个插件使用不同的
classloader。在这个例子中，加载Log接口是EclipseClassLoader，加载Log实现类的thread context
classloader是JNLPClassLoader，它们并不相同。问题就来了，用不同classloader加载的类被认为是无关的，所以JCL
的实现类不能赋给Log接口类，就会抛出那个异常。
</p>
<p>关于JCL classloader问题更详细解释，请看log4j的创始人之一，Ceki Gülcü写的文章<br>
<a href="http://www.qos.ch/logging/classloader.jsp">"Taxonomy of class loader problems encountered when using Jakarta Commons Logging"</a>
</p>
<p>为了解决这个问题，我启动了一个项目，jcleclipse -- 重写了JCL，固定实现为把所有的log写到eclipse自己的ILog里。这样就不用要求用户在某个指定的地方建目录来存储log。</p>
<p>jcleclipse项目主页 <a href="http://jcleclipse.sourceforge.net/">http://jcleclipse.sourceforge.net/</a><br>
jcleclipse项目概要 <a href="http://sourceforge.net/projects/jcleclipse">http://sourceforge.net/projects/jcleclipse</a><br>
</p><img src ="http://www.blogjava.net/ravenix/aggbug/12541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ravenix/" target="_blank">ravenix</a> 2005-09-09 14:30 <a href="http://www.blogjava.net/ravenix/archive/2005/09/09/12541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>