Mapxtreme与XFire的集成解决之道
昨天在做系统迁移的时候,发现系统中基于Xfire的webservice和基于MapXtreme4.71的webgis不能集成在同一个项目中。为了负载均衡,我配置了3个服务器,分别完成地图渲染,数据挖掘(运行大数据量任务)和web服务器,web服务器负责相应用户请求并把地图相关的请求发送到地图渲染服务器,大数据量请求发送到数据挖掘服务器。之前先完成Xfire的webservice部分,测试很好,之后我并集中精力开发webgis,在开发过程中我利用到了jdom1.0以前的版本,由于一直关注webgis,没有再去测试之前完成的webservice,结果在准备部署迁移的时候,发现先前测试良好的webservice部分报错说
java.lang.ClassNotFoundException: org.jdom.Content。
感觉是jdom版本的问题,下面就是我的解决办法。
1. 更新到更高版本的Jdom,1.0,1.1均更新过,结果webgis部分在生成地图的时候报错,无法运行,出错如下:
java.lang.NoSuchMethodError:org.jdom.Element.addContent(Lorg/jdom/Element;)
2. 至此确定是jdom版本的问题,而且Jdom在这一点上没有实现向下兼容,但是webservice和webgis都是系统必须集成的模块,为此我想过降低Xfire的版本,发现Xfire依赖的jdom版本都是1.0;升级Mapxtreme版本,发现它用的版本都是jdom1.0版本以下。
3. 在网上搜索发现可以在jdom的源代码的org..jdom.ementjava类中添加几个如下方法:
public Element addContent(Text text) { this.content.add(text);
return this;
}
public Element addContent(Element element) {
this.content.add(element);
return this;
}
public Element addContent(ProcessingInstruction pi) {
this.content.add(pi);
return this;
}
public Element addContent(EntityRef entity) {
this.content.add(entity);
return this;
}
public Element addContent(Comment comment) {
this.content.add(comment);
return this;
}
扩展org.jdom.output.XMLOutputter.java,添加如下方法:
public XMLOutputter(String indent, boolean newlines, String encoding) {
this.currentFormat.indent = indent;
this.currentFormat.encoding = encoding;
}
public XMLOutputter(String indent, boolean newlines) {
this.currentFormat.indent = indent;
}
public XMLOutputter(String indent) {
this.currentFormat.indent = indent;
}
4. 当我把这些源代码添加到我的项目中测试的时候,发现问题依然没有解决,报出的错误是XMLOutputter中没有init方法,当时感觉可能改造也不能成功。到晚上10点钟,做最后尝试,经过fatjar成功打包成Jdom1.2(Jdom当前版本是1.1,似乎没有继续更新的势头,所以我个人定义版本位为1.2)。后加入到项目中后,mapxtreme和Xfire成功的集成进来了,终于可以安心的回宿舍睡觉了,呵呵。
附件中是我扩展的Jdom1.2.jar,不知道这样做是不是违法的。