posts - 274,  comments - 1258,  trackbacks - 0
Jxls是一个java开源项目的名称。它按照自定义的excel模板来生成excel文件。excel模板也是一个xls文件,上面有一些jxls定义的标签。
  Leader Bruise最近给了我一个任务:把jxls化为"nxls",也就是把它移植到.net平台上。
  经过一段时间的了解,我发现把java代码移植到.net不外乎以下三种方法:
  • 手工翻译源代码。
  • 使用M$的JLCA(Microsoft Java Language Conversion Assistant 3.0)来翻译源代码。
  • 使用ikvm翻译目标代码。
这三种方法各有各的优点,也各有各的问题。
  手工翻译源代码的最大优点是彻底,可以保证翻译的质量。缺点是工程非常庞大,jxls本身就有100万字节以上的代码(包括注释),而且还大量引用了其它开源项目(下文会给出其依赖图),如果要转换的话必须把它所依赖的所有项目都转换。(你总不能叫.net去引用某个jar包吧?)
  用M$的JLCA可以把项目里大多数代码翻译成C#,翻译质量还不错,但也不能100%地转换,最后还是要手工修改,估计代码量还是太大。
  ikvm比较特别,它实现的是中间码的转换,形象地说就是把.jar转换成.dll,由于转换后的类库立即可用,因此这绝对是代价最低的办法。但也存在一些问题:
  • ikvm有bug,目前最常见的问题转换后的程序会抛出类初始化失败的异常,期待其将来的版本能够修正这些问题。
  • 使用转换后的类库的程序必需引用ikvm的dll库。主要是指IKVM.Hybrid.GNU.Classpath.OpenJDK.dll和IKVM.Runtime.dll,平白地增加了20多M,不爽,而且还不能放进GAC(ikvm-0.34.0.2版可以,但它的RPWT好像比较严重
  • 接口不干净。尽管ikvm已经尽力做了一些类型的映射,比如将java.lang.String映射到System.String,但它对一些较复杂的类(比如说:File类)是无能为力的,而这些类常常会出现在用户使用的接口上,这使得用户使用该接口变得麻烦。可以考虑手工写一些Adapter来解决。
  • 缺乏源代码和相关文档,用户不懂得怎么调用。当然,也可以用reflector等反编译工具来得到源代码。
经过以上的分析之后,我决定按以下步骤来进行转换:
  第一步:找出所有的jar包的依赖关系,从而明确工作目标。
  第二步:使用ikvm将所有相关的jar包编译成dll。
  第三步:使用JLCA将所有的示例代码转换成C#源代码,用于测试转换后的类库,可能需要修改类库里的少量代码。
  第四步:假如有时间,再逐个将各个dll中间码类库改成真正的C#源代码类库。

附:经过今日的一番努力,以及Maven的帮助,终于了解jxls-core及其所依赖的各类库的依赖关系,并画出“依赖树”如下:
再附:最近手风一直不太顺,转换后的dll常常抛出一些莫名其妙的异常,首先是在digester里边的org.apache.commons.digester.ObjectCreateRule.begin(Attribute)处,使用语句“Class clazz = digester.getClassLoader().loadClass(realClassName); ”会抛出ClassNotFoundException,其中realClassName的值是“net.sf.jxls.tag.ForEachTag ”,我把该语句改成“        Class clazz = java.lang.Thread.currentThread().getContextClassLoader().loadClass(realClassName);

”(也就是说,换了一个ClassLoader)可以解决。
  改完后又抛出了一个RuntimeException:
StackTrace

posted on 2007-08-16 21:10 踏雪赤兔 阅读(2795) 评论(5)  编辑 收藏 引用

FeedBack:
# re: 化JXLS为NXLS[原] (不断更新中...) by 踏雪赤兔
2007-08-18 16:10 | 小bug
真是辛苦的工作啊...  回复  更多评论
  
# re: 化JXLS为NXLS[原]by 踏雪赤兔
2007-09-16 13:27 | 骑赤兔的关公
完全没这个必要
为什么不整两个平台,J2EE和.NET并存(尽管我不懂.NET)?化什么化啊?
在TOMCAT里面弄个servlet,专门负责服务器端XLS reports的生成,在.NET里面发送HTTP请求给那个servlet不就行了?  回复  更多评论
  
# re: 化JXLS为NXLS[原]by 踏雪赤兔 -- Leader Bruise这个Leader是怎么当的
2007-09-18 18:18 | 萨姆
骑赤兔的关公说得有道理.
Leader Bruise这个Leader是怎么当的?怎么会分配给兔子这么一个傻X任务?  回复  更多评论
  
# re: 化JXLS为NXLS[原]by 踏雪赤兔
2007-09-18 22:58 | 踏雪赤兔
jxls是一个类库,此project的目标是把这个类库迁移到.net上,使得.net的项目能够使用这项功能。要求所有需要处理xls的.net程序都配备一个tomcat显然是不现实的。还有,请各位注意文明用语。  回复  更多评论
  
# re: 化JXLS为NXLS[原]by 踏雪赤兔
2007-09-19 09:46 | 骑赤兔的关公
RE: # re: 化JXLS为NXLS[原]by 踏雪赤兔
2007-09-18 22:58 by 踏雪赤兔

最近看了一点Web Services.
不知道踏雪赤兔为什么把我的话理解为"要求所有需要处理xls的.net程序都配备一个tomcat",并不要很多TOMCAT,有且只有一个就够了,(确切的说,是部署在TOMCAT中的SERVLET或者Web Service,一而足!)
P.S.: 1.曾经参加过一个项目,SERVER端就是一个部署在TOMCAT中的SERVLET,使用HTTP协议跟CLIENT端的程序(用MICROSOFT VS2005开发)互传XML.
建议踏雪赤兔把好钢用在刀刃上,不要做这种毫无意义的转化.
2. 我发现了jXLS的一个BUG,报告给Leonid Vysochyn,并给出了修正建议.他把我加入了jXLS Developers之列,让我在SVN里面自己改--现在他自己实在没有时间去维护jXLS.所以,如果让Leo自己去搞个jXLS的.net版本,真的是不可能.实际上也没这个必要.
3. 我始终认为,各种平台是完全可以并存并和睦相处的.
4. 我的名字"骑赤兔的关公"并无意冒犯阁下.

---- original message ----
jxls是一个类库,此project的目标是把这个类库迁移到.net上,使得.net的项目能够使用这项功能。要求所有需要处理xls的.net程序都配备一个tomcat显然是不现实的。还有,请各位注意文明用语。  回复  更多评论
  
只有注册用户登录后才能发表评论。

百度空间| 见闻日记| 编程感悟
我的twitter


LOGO

自我介绍:百度厂基础平台车间的一名挨踢民工。擅长C++、算法、语言设计、分布式计算,也用过Java,Python, PHP,JS/AS等语言开发。请关注我的twitter (免翻墙版) 发QQ消息


添加到收藏夹 Locations of visitors to this page

常用链接

随笔分类(300)

随笔档案(274)

文章分类(38)

相册

收藏夹(54)

与博主互动

博客手拉手

搜索

  •  

积分与排名

  • 积分 - 392997
  • 排名 - 10

最新评论

阅读排行榜

评论排行榜