ravenix

鱼如何控制自己的呼吸
posts - 7, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2005年8月18日

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

posted @ 2005-09-09 14:30 ravenix 阅读(1256) | 评论 (1)编辑 收藏

如果用digister处理的xml里包含了外部dtd指定,即在!DOCTYPE中用PUBLIC指定外部dtd,即使使用了

digester.setValidating(false);

底层的sax解析器xerces仍然会去指定的地址去加载DTD,特别地,如果指定的地址无法获得DTD,就会抛出异常:
SAXException: The markup declarations contained or pointed to by the document type declaration must be well-formed

为了避免这个问题,可以使用这样的语句:
digester.setValidating(false);
digester.setFeature(
"http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

当然这个设置只有在底层的sax解析器是xerces才有效。如果你使用的是其它的sax解析器,请参考解析器的文档。

posted @ 2005-08-30 15:57 ravenix 阅读(1058) | 评论 (0)编辑 收藏

目前所知道的
apache xerces 支持中文元素
saxon自带的aelfred 不支持

posted @ 2005-08-26 16:04 ravenix 阅读(498) | 评论 (0)编辑 收藏

尽管有一些不足,wutka dtdparser 仍然是使用最广泛的java dtd dom解析器。

其它可用的java dtd parser有 Ronald Bourret DTD ParserMatra DTD parser

要在DTD中使用中文,必须要在dtd文件的第一行写上

<?xml version="1.0" encoding="UTF-8"?>

并且将dtd文件以utf-8格式保存。别的编码格式也可以试试,但我不想冒险。

dtdparser不使用这个encoding指示来解析DTD,我们只能自己想办法,修改它的代码。

dtdparser有这些构造器(省略了带trace的)

DTDParser(java.io.File in)
DTDParser(java.io.Reader in)
DTDParser(java.net.URL in)

其中以Reader为参数的没有编码问题,因为reader本身已经指定了字符集。

以File为参数的构造器内部使用了new FileReader(in),这个方式使用系统默认字符集,不要用它,可以用FileInputStream和InputStreamReader来指定字符集,传递给以Reader为参数的构造器。

以URL为参数的构造器内部使用了new InputStreamReader(in.openStream()),没有指定字符集,我们可以给它增加一个带有String charsetName参数的构造器,内部调用new InputStreamReader(in.openStream(), charsetName)

posted @ 2005-08-22 21:02 ravenix 阅读(1353) | 评论 (1)编辑 收藏

w3c CSS2规范中明确指出,在样式定义中要使用unicode字符,必须用转义方式

unicode的写法如下

unicode 	\\[0-9a-f]{1,6}[ \n\r\t\f]?

必须以反斜线开头,后面跟1到6个16进制字符(0-9a-f)来表示该字符的unicode码,字符的后面可以附加空格,制表符,换行或回车。

举例来说,样式“标题”应该写成\6807\9898

java工具native2ascii可以用来查看字符串的unicode码,注意在CSS里反斜线后面不写u

另外要注意的是,用sac flute来解析CSS的时候,转义字串的末尾如果是回车的话,一定要附加空格,否则会被解释成“标题\n”

CSS里注释是可以写中文的,用/* */包围起来就好了。
带有中文的CSS最好用UTF-8编码保存,并且在CSS的第一行写上
@charset "UTF-8";

CSS规范并没有规定解析器必须支持何种编码,但是UTF-8是被普遍支持的,如果你的解析器支持多语言编码的话。

posted @ 2005-08-22 17:31 ravenix 阅读(777) | 评论 (0)编辑 收藏

w3c的sac推荐了几个java实现: flute 1.3, batik-css和cssparser

我用简单的CSS测试了flute和batik,flute功能正常,但是batik会抛出IllegalStateException。具体原因没有仔细研究。

那位高手成功用过batik的css解析器,务请告诉我,不胜感谢。

posted @ 2005-08-21 18:56 ravenix 阅读(916) | 评论 (0)编辑 收藏

今天用FOP的TTFReader工具创建字体影射文件,结果报FileNotFoundException

D:\fop-0.20.5>ttfreader.bat c:\WINDOWS\Fonts\simfang.ttf simfang.xml
TTF Reader v1.1.1

Reading c:\WINDOWS\Fonts\simfang.ttf...

Number of glyphs in font: 7580
Postscript format 3
Creating xml font file...

Creating CID encoded metrics
Writing xml font file simfang.xml...

javax.xml.transform.TransformerException: java.io.FileNotFoundException: file:\D
:\fop-0.20.5\simfang.xml (文件名、目录名或卷标语法不正确。)
at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont
entHandler(TransformerIdentityImpl.java:263)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf
ormerIdentityImpl.java:296)
at org.apache.fop.fonts.apps.TTFReader.writeFontXML(TTFReader.java:243)
at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:196)
Caused by: java.io.FileNotFoundException: file:\D:\fop-0.20.5\simfang.xml (文件
名、目录名或卷标语法不正确。)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileOutputStream.(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont
entHandler(TransformerIdentityImpl.java:253)
... 3 more
---------
java.io.FileNotFoundException: file:\D:\fop-0.20.5\simfang.xml (文件名、目录名或
卷标语法不正确。)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(Unknown Source)
at java.io.FileOutputStream.(Unknown Source)
at org.apache.xalan.transformer.TransformerIdentityImpl.createResultCont
entHandler(TransformerIdentityImpl.java:253)
at org.apache.xalan.transformer.TransformerIdentityImpl.transform(Transf
ormerIdentityImpl.java:296)
at org.apache.fop.fonts.apps.TTFReader.writeFontXML(TTFReader.java:243)
at org.apache.fop.fonts.apps.TTFReader.main(TTFReader.java:196)
This font contains no embedding license restrictions

在google上搜索到apache的邮件列表里有相关讨论,说是FOP只能在jdk 1.4上运行。

jdk1.5内置了xerces和xalan,这是和1.4不同的地方。

我修改了ttfreader.bat,把CLASSPATH里xml-apis.jar,xercesImpl-2.2.1.jar,xalan-2.4.1.jar注释掉,再运行,成功!

posted @ 2005-08-18 13:54 ravenix 阅读(1296) | 评论 (1)编辑 收藏