最近在学习ArcServer Java ADF的开发,遇到了怎么用Java调用COM组件的问题。ArcServer是基于COM实现的ArcObjects,因为ServerAPI是粗粒度的API,为了避免遭遇性能瓶颈,推荐的解决方案是具体功能用COM组件实现,然后用Java调用COM组件完成特定功能,尽可能地减少DCOM调用。
了解ArcServer JavaADF或者ArcEngine JavaAPI的人一定知道ESRI解决Java调用COM组件的问题是借助Jintegra的产品来解决这个问题的。Jintegra的产品为ArcObjects生成了一组Java的Proxy classes,我们自己写的COM组件Proxy classes怎么办呢?
今天为了解决我的笔记本上Power Users不能访问本机的ArcServer对象上它的网站去查找相关资料。看到有试用版下载,不过只能使用30天,30天过后还可以重新下载获取新的试用License。但是还是不爽,Java软件的授权一向以来做得不是很好,所以我就想看看怎么破解了它。下载了一个zip包,我不喜欢exe的安装程序,东西很少就一个Jintegra.jar。打开看看了,很快就找到jintegra.xml这个License文件。可以下载的SDK有两个版本2.5和2.4,但是不知道ArcServer用的是哪个版本,文档中找不到相关的信息。不管它先试试看,我把arcgis下的Jintegra.jar中的license抽出来,导入下载的sdk/lib/jintegra.jar中,用view参数看License时发现竟然是2.3,真是不走运啊。还好,从2.3升级到2.4,只要把jintegra.jar等一堆东西换掉就行了,原来生成的Proxy jars不用更新,2.5就得重新Proxy jars。也就是说2.4生成的Proxy和2.3是兼容的,这也是一个福音啊。因为我在对那组处理License的class反编译后发现这些class被混淆过,非常乱很多一个字母的方法,字符串乱七八糟的几乎看不出任何含义。看来以前的办法行不通。还好我发现一个Version类,Runtime的版本是从这个Class上获取的,这个Class非常简单就几个方法。不能把ESRI的License升级到2.4,那就把Runtime降为2.3的使用。说干就干,还真的没有问题。
COM的Java Proxy生成非常简单只要执行com2java,然后选择要创建Proxy的类型库,可以是dll、tlb或者olb等都可以,然后可以创建到指定的package中。生成的是一组Java源文件,编译打包成jar即可。好像com2java不需要使用jintegra.jar,也就是不受license限制。因为License文件在jintegra.jar中,所以发布时也是受License限制的,也就是说试用版的SDK发布的东西还是试用版只能用到下载SDK后的第30天。其实我也只需要它帮我生成Proxy就行了,因为Java ADF中有License。
我按照文档做了一个ATL DLL的例子,native mode下调用dll没有问题,但是remote mode下出了点问题,创建不了对象。后来发现创建COM+程序时,要设置安全性“调用的身份认证级别”必须为“连接”,默认为“数据包”,把这里一改就好了。
现在的人真是浮躁,好多的问题只要认真研读一下相关文档就可以解决,乃至认真读过这些文档的人成了高手,其实这只是一个GIS开发人员必须做的基本功。
了解ArcServer JavaADF或者ArcEngine JavaAPI的人一定知道ESRI解决Java调用COM组件的问题是借助Jintegra的产品来解决这个问题的。Jintegra的产品为ArcObjects生成了一组Java的Proxy classes,我们自己写的COM组件Proxy classes怎么办呢?
今天为了解决我的笔记本上Power Users不能访问本机的ArcServer对象上它的网站去查找相关资料。看到有试用版下载,不过只能使用30天,30天过后还可以重新下载获取新的试用License。但是还是不爽,Java软件的授权一向以来做得不是很好,所以我就想看看怎么破解了它。下载了一个zip包,我不喜欢exe的安装程序,东西很少就一个Jintegra.jar。打开看看了,很快就找到jintegra.xml这个License文件。可以下载的SDK有两个版本2.5和2.4,但是不知道ArcServer用的是哪个版本,文档中找不到相关的信息。不管它先试试看,我把arcgis下的Jintegra.jar中的license抽出来,导入下载的sdk/lib/jintegra.jar中,用view参数看License时发现竟然是2.3,真是不走运啊。还好,从2.3升级到2.4,只要把jintegra.jar等一堆东西换掉就行了,原来生成的Proxy jars不用更新,2.5就得重新Proxy jars。也就是说2.4生成的Proxy和2.3是兼容的,这也是一个福音啊。因为我在对那组处理License的class反编译后发现这些class被混淆过,非常乱很多一个字母的方法,字符串乱七八糟的几乎看不出任何含义。看来以前的办法行不通。还好我发现一个Version类,Runtime的版本是从这个Class上获取的,这个Class非常简单就几个方法。不能把ESRI的License升级到2.4,那就把Runtime降为2.3的使用。说干就干,还真的没有问题。
COM的Java Proxy生成非常简单只要执行com2java,然后选择要创建Proxy的类型库,可以是dll、tlb或者olb等都可以,然后可以创建到指定的package中。生成的是一组Java源文件,编译打包成jar即可。好像com2java不需要使用jintegra.jar,也就是不受license限制。因为License文件在jintegra.jar中,所以发布时也是受License限制的,也就是说试用版的SDK发布的东西还是试用版只能用到下载SDK后的第30天。其实我也只需要它帮我生成Proxy就行了,因为Java ADF中有License。
我按照文档做了一个ATL DLL的例子,native mode下调用dll没有问题,但是remote mode下出了点问题,创建不了对象。后来发现创建COM+程序时,要设置安全性“调用的身份认证级别”必须为“连接”,默认为“数据包”,把这里一改就好了。
现在的人真是浮躁,好多的问题只要认真研读一下相关文档就可以解决,乃至认真读过这些文档的人成了高手,其实这只是一个GIS开发人员必须做的基本功。