﻿<?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</title><link>http://www.blogjava.net/ravenix/</link><description>鱼如何控制自己的呼吸</description><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 20:58:11 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 20:58:11 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><item><title>设置digister不加载外部dtd，加快处理速度</title><link>http://www.blogjava.net/ravenix/archive/2005/08/30/11571.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Tue, 30 Aug 2005 07:57:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/30/11571.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/11571.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/30/11571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/11571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/11571.html</trackback:ping><description><![CDATA[如果用digister处理的xml里包含了外部dtd指定，即在!DOCTYPE中用PUBLIC指定外部dtd，即使使用了<BR><BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">digester.setValidating(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV></DIV><BR>底层的sax解析器xerces仍然会去指定的地址去加载DTD，特别地，如果指定的地址无法获得DTD，就会抛出异常：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>SAXException: <SPAN style="COLOR: #000000">The&nbsp;markup&nbsp;declarations&nbsp;contained&nbsp;or&nbsp;pointed&nbsp;to&nbsp;by&nbsp;the&nbsp;document&nbsp;type&nbsp;declaration&nbsp;must&nbsp;be&nbsp;well</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">formed</SPAN></DIV></DIV><BR>为了避免这个问题，可以使用这样的语句：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">digester.setValidating(</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align=top>digester.setFeature(</SPAN><SPAN style="COLOR: #000000">"http://apache.org/xml/features/nonvalidating/load-external-dtd</SPAN><SPAN #000000? COLOR:>"</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">);</SPAN></DIV></DIV><BR>当然这个设置只有在底层的sax解析器是xerces才有效。如果你使用的是其它的sax解析器，请参考解析器的文档。<img src ="http://www.blogjava.net/ravenix/aggbug/11571.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-08-30 15:57 <a href="http://www.blogjava.net/ravenix/archive/2005/08/30/11571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>支持中文element的sax parser</title><link>http://www.blogjava.net/ravenix/archive/2005/08/26/11215.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Fri, 26 Aug 2005 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/26/11215.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/11215.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/26/11215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/11215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/11215.html</trackback:ping><description><![CDATA[目前所知道的<br>
<a href="http://xml.apache.org/">apache xerces</a> 支持中文元素<br>
<a href="http://saxon.sourceforge.net/">saxon</a>自带的aelfred 不支持<br><img src ="http://www.blogjava.net/ravenix/aggbug/11215.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-08-26 16:04 <a href="http://www.blogjava.net/ravenix/archive/2005/08/26/11215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用dtdparser解析中文dtd</title><link>http://www.blogjava.net/ravenix/archive/2005/08/22/10730.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Mon, 22 Aug 2005 13:02:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/22/10730.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/10730.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/22/10730.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/10730.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/10730.html</trackback:ping><description><![CDATA[<p>尽管有一些不足，<a href="http://www.wutka.com/dtdparser.html">wutka dtdparser</a> 仍然是使用最广泛的java dtd dom解析器。
</p><p>其它可用的java dtd parser有 <a href="www.rpbourret.com/dtdparser/">Ronald Bourret DTD Parser</a> 和 <a href="http://matra.sourceforge.net/">Matra DTD parser</a></p>
<p>要在DTD中使用中文，必须要在dtd文件的第一行写上</p>
<table bgcolor="#cccccc" border="1" cellpadding="4" cellspacing="0">
  <tbody><tr>
    <td>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</td>
  </tr>
</tbody></table>

<p>并且将dtd文件以utf-8格式保存。别的编码格式也可以试试，但我不想冒险。<br>
</p>
<p>dtdparser不使用这个encoding指示来解析DTD，我们只能自己想办法，修改它的代码。<br>
</p>

<p>dtdparser有这些构造器（省略了带trace的）</p>
<p> <code><b>DTDParser(java.io.File in)<br>
  DTDParser(java.io.Reader in)<br>
DTDParser(java.net.URL in)</b></code></p>
<p>其中以Reader为参数的没有编码问题，因为reader本身已经指定了字符集。</p>
<p>以File为参数的构造器内部使用了new FileReader(in)，这个方式使用系统默认字符集，不要用它，可以用FileInputStream和InputStreamReader来指定字符集，传递给以Reader为参数的构造器。</p>
<p>以URL为参数的构造器内部使用了new
InputStreamReader(in.openStream())，没有指定字符集，我们可以给它增加一个带有String
charsetName参数的构造器，内部调用new InputStreamReader(in.openStream(),
charsetName)</p><img src ="http://www.blogjava.net/ravenix/aggbug/10730.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-08-22 21:02 <a href="http://www.blogjava.net/ravenix/archive/2005/08/22/10730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在CSS中使用中文定义</title><link>http://www.blogjava.net/ravenix/archive/2005/08/22/10617.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Mon, 22 Aug 2005 09:31:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/22/10617.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/10617.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/22/10617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/10617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/10617.html</trackback:ping><description><![CDATA[<p><a href="http://www.w3.org/TR/REC-CSS2/">w3c CSS2规范</a>中明确指出，在样式定义中要使用unicode字符，必须用转义方式</p>
<p>unicode的写法如下</p>
<table bgcolor="#cccccc" border="1" cellpadding="4" cellspacing="0">
  <tbody><tr>
    <td><pre>unicode 	\\[0-9a-f]{1,6}[ \n\r\t\f]?<br></pre></td>
  </tr>
</tbody></table>
<p>必须以反斜线开头，后面跟1到6个16进制字符（0-9a-f）来表示该字符的unicode码，字符的后面可以附加空格，制表符，换行或回车。</p>
<p>举例来说，样式“标题”应该写成\6807\9898</p>
<p>java工具native2ascii可以用来查看字符串的unicode码，注意在CSS里反斜线后面不写u</p>
<p>另外要注意的是，用sac flute来解析CSS的时候，转义字串的末尾如果是回车的话，一定要附加空格，否则会被解释成“标题\n”<br>
</p>
<p>CSS里注释是可以写中文的，用/* */包围起来就好了。<br>
带有中文的CSS最好用UTF-8编码保存，并且在CSS的第一行写上
<table bgcolor="#cccccc" border="1" cellpadding="4" cellspacing="0">
  <tbody><tr>
    <td><pre>@charset "UTF-8";<br></pre></td>
  </tr>
</tbody></table>
</p><p>CSS规范并没有规定解析器必须支持何种编码，但是UTF-8是被普遍支持的，如果你的解析器支持多语言编码的话。</p>
<p></p><img src ="http://www.blogjava.net/ravenix/aggbug/10617.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-08-22 17:31 <a href="http://www.blogjava.net/ravenix/archive/2005/08/22/10617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>batik-css不是好的sac实现？</title><link>http://www.blogjava.net/ravenix/archive/2005/08/21/10622.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Sun, 21 Aug 2005 10:56:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/21/10622.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/10622.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/21/10622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/10622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/10622.html</trackback:ping><description><![CDATA[<p><a href="www.w3.org/Style/CSS/SAC/">w3c的sac</a>推荐了几个java实现: flute 1.3, batik-css和cssparser</p>
<p>我用简单的CSS测试了flute和batik，flute功能正常，但是batik会抛出IllegalStateException。具体原因没有仔细研究。</p>
<p>那位高手成功用过batik的css解析器，务请告诉我，不胜感谢。</p><img src ="http://www.blogjava.net/ravenix/aggbug/10622.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-08-21 18:56 <a href="http://www.blogjava.net/ravenix/archive/2005/08/21/10622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FOP TTFReader FileNotFoundException</title><link>http://www.blogjava.net/ravenix/archive/2005/08/18/10426.html</link><dc:creator>ravenix</dc:creator><author>ravenix</author><pubDate>Thu, 18 Aug 2005 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/ravenix/archive/2005/08/18/10426.html</guid><wfw:comment>http://www.blogjava.net/ravenix/comments/10426.html</wfw:comment><comments>http://www.blogjava.net/ravenix/archive/2005/08/18/10426.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ravenix/comments/commentRss/10426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ravenix/services/trackbacks/10426.html</trackback:ping><description><![CDATA[<p>今天用FOP的TTFReader工具创建字体影射文件,结果报FileNotFoundException</p>
<table bgcolor="#cccccc" border="1" cellpadding="4" cellspacing="0">
  <tbody><tr>
    <td><pre>D:\fop-0.20.5>ttfreader.bat c:\WINDOWS\Fonts\simfang.ttf simfang.xml<br>TTF Reader v1.1.1<br><br>Reading c:\WINDOWS\Fonts\simfang.ttf...<br><br>Number of glyphs in font: 7580<br>Postscript format 3<br>Creating xml font file...<br><br>Creating CID encoded metrics<br>Writing xml font file simfang.xml...<br><br>javax.xml.transform.TransformerException: java.io.FileNotFoundException: file:\D<br>:\fop-0.20.5\simfang.xml (文件名、目录名或卷标语法不正确。)<br>        at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont<br>entHandler(TransformerIdentityImpl.java:263)<br>        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf<br>ormerIdentityImpl.java:296)<br>        at org.apache.fop.fonts.apps.TTFReader.writeFontXML(TTFReader.java:243)<br>        at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:196)<br>Caused by: java.io.FileNotFoundException: file:\D:\fop-0.20.5\simfang.xml (文件<br>名、目录名或卷标语法不正确。)<br>        at java.io.FileOutputStream.open(Native Method)<br>        at java.io.FileOutputStream.<init>(Unknown Source)<br>        at java.io.FileOutputStream.<init>(Unknown Source)<br>        at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont<br>entHandler(TransformerIdentityImpl.java:253)<br>        ... 3 more<br>---------<br>java.io.FileNotFoundException: file:\D:\fop-0.20.5\simfang.xml (文件名、目录名或<br>卷标语法不正确。)<br>        at java.io.FileOutputStream.open(Native Method)<br>        at java.io.FileOutputStream.<init>(Unknown Source)<br>        at java.io.FileOutputStream.<init>(Unknown Source)<br>        at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont<br>entHandler(TransformerIdentityImpl.java:253)<br>        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf<br>ormerIdentityImpl.java:296)<br>        at org.apache.fop.fonts.apps.TTFReader.writeFontXML(TTFReader.java:243)<br>        at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:196)<br>This font contains no embedding license restrictions<br></init></init></init></init></pre></td></tr>
</tbody></table><p>在google上搜索到apache的邮件列表里有<a href="http://mail-archives.apache.org/mod_mbox/xmlgraphics-fop-users/200506.mbox/threads.html">相关讨论</a>,说是FOP只能在jdk 1.4上运行。</p>
<p>jdk1.5内置了xerces和xalan，这是和1.4不同的地方。</p><p>我修改了ttfreader.bat，把CLASSPATH里xml-apis.jar，xercesImpl-2.2.1.jar，xalan-2.4.1.jar注释掉，再运行，成功！</p><img src ="http://www.blogjava.net/ravenix/aggbug/10426.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-08-18 13:54 <a href="http://www.blogjava.net/ravenix/archive/2005/08/18/10426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>