`
zhaozhongwei
  • 浏览: 52833 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

我的处女作:关于BIRT_2_3_0_RC1源代码构建后的一个问题

    博客分类:
  • birt
阅读更多

最近要做一个图形编辑器,弄了N久也没弄出来,后来看到可以根据birt的报表设计器改,改动是巨大的,其实说是改,还不如说拿它当例子,好熟悉一下gef,感觉收获很大,结合八进制的blog,看起来就不那么费劲了,但是在建立脚本数据库的时候总出现问题,改来改去,改来改去,搜索无数次咋就不好使呢,又debug了3天,终于发现了,事实上是好使的,因为自己构建出来的报表设计器比发布出来的插件对一页,也就是正常的报表设计器是包含5个页的多页编辑器,而我自己构建出来的是6个!预览按正常套路是第五个页(Preview),而我每次都点第六个页(New Preview Prototype),所以总抛异常(由ClassNotFoundException引起的),偶尔发现了这个问题,也就发现用preview好使,所以就继续debug,发现原来是类加载器在搞鬼,两个地方调用的代码是一样的,不过因为用了不同的类加载器实例(类型也不同,Preview用的是org.eclipse.birt.report.viewer.utilities.ReloadableClassLoader,New Preview Prototype用的是org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader),因为如果报表设计器里需要用脚本数据库的话,需要把引用的类(这里是编译后的.class文件)放到org.eclipse.virt.report.viewer插件的/birt/WEB-INF/classes/目录下,记住别忘了,把对应的包也加上,比如类的全名是a.b.c,那么c.class应该放到/birt/WEB-INF/classes/a/b/下。这样就不会出错了!因为通过ReloadableClassLoader类加载器可以加载这个目录下的类文件。

现在回到我的问题上,由于对类加载器知道的非常少,就不多说了,给和我遇到同样问题的人提供一个解决方案,如果想让New Preview Prototype好用,需要把脚本数据库中的类文件(.class文件)再复制一份到org.eclipse.birt.report.designer.ui.preview.static_html插件里,(本来以为这里会有可见性的问题,原来以为需要改MANIFEST.MF的Export-Package,刚才测试了一下没影响,看来Export-Package可见性是真对别的插件的,而不是针对osgi平台的,哈哈,正是这么回事!笨了!),还有一处改动就是在org.eclipse.birt.report.designer.ui.preview.static_html插件的org.eclipse.birt.report.designer.ui.viewer.StaticHTMLViewer类的内部类HyperlinkEngineConfig的构造函数最后加上如下三行代码:

        ClassLoader appClassLoader = StaticHTMLViewer.class.getClassLoader( );
        getAppContext( ).put(
                EngineConstants.APPCONTEXT_CLASSLOADER_KEY, appClassLoader );

 

这里的appClassLoader也是org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader的对象,但这个对象是加载这个插件的类加载器,所以加载脚本数据库的类也就没问题了,因为脚本数据库的类也被放到了这个这个插件里(刚才那部)

我上面所说的插件在我这里其实就是工程,因为我是自己build的。

语文学的不好,不知道会不会对大家有帮助!这段时间我会把我遇到的别的问题和大家一起分享的,因为很多问题都是看别人的文章解决的:)

因为birt在解析js脚本的时候用到了rhino,一个在js里可以调用java类的框架,这里有动态生成.class的java文件,也值得看一看,虽然没看懂,呵呵,看懂了也会和大家一起交流,好的东西就要大家一起分享嘛!这是我写的第一个博客,希望大家对付看,也希望提出批评等宝贵意见,互相学习互相进步!

1
0
分享到:
评论
2 楼 whydayu 2008-10-09  

看了你的帖子有个问题请教,我是从CVS上下载的birt2.3.0的源码,但是编译的时候却总是编译不过去,能否指教一下具体的编译过程!很急,谢谢!我的联系方式:whydayu@yahoo.com.cn
1 楼 zhaozhongwei 2008-08-16  
希望birt应该有更好的解决方案,但我英语太烂了,汉语都这么烂呢,也就没上maillist上找解决方案,我试图得到org.eclipse.birt.report.viewer.utilities.ReloadableClassLoader,从而避免相同的.class出现在两个地方,但是失败了,第一次改动得到的结果是null,又改动得到的结果是导致Jetty无数次的启动,也没时间仔细研究,只好找个临时方案了

相关推荐

Global site tag (gtag.js) - Google Analytics