2010年中秋闲来无事, 把以前做Corba开发的一些积累整理一下, 抽空发几贴。 希望对后面的同行有所帮助。
---------------------------------------------------------------------
说明: 本文没有图片,方便转载,欢迎转载。 请注明 JavaEye
---------------------------------------------------------------------
Java Corba 的实现比较多,有 Jacorb, OpenOrb, Orbacus Java版本等等, Eclipse从3.0一路走到现在也没有什么好说的, Orbstudio现在想下载一个都有点麻烦,但还是可以搜索到。 关于 Eclipse , Orbstudio 和 OpenOrb搭建环境的资料有几篇不错的,在这里先推荐一下:
1。Eclipse3.2下配置ORBStudio插件的corba开发环境 http://ardenyu.iteye.com/blog/137769
2。Eclipse中corba环境的建立 http://blog.donews.com/chaoyang/archive/2005/09/28/570630.aspx
我这里就着重讲Orbacus 4.3.4(JOB) + Eclipse 3.6 (Helios) + ORBStudio777的环境搭建。
1。 从网络上下载了上述三个软件包后,还是不能工作的。还需要准备 ant, 这个工具用来编译 Orbacus, 就目前而言用JDK1.6-U21, ant1.8 对JOB的编译还没有看到什么投诉的(32位环境下,windows 7 ,FC13, RH5.5上都实验过了)。 具体过程如下:
a) jdk安装在 c:\jdk1.6目录里面, 设置 JAVA_HOME,修改path 增加 c:\jdk1.6\bin(不会? 鼠标右键点我的电脑->属性,再选择高级系统设置-> 高级页面,环境变量, 在上面的用户变量区域里面操作 )
b) 把ant解压缩到 c:\ant, 增加 ANT_HOME, 修改path 增加 c:\ant\bin ,
c) 把 JOB 的目录解压缩, 有个目录 JOB-4.3.4-bin, 把这个目录移动到C:\JOB-4.3.4\, 里面有个自目录\bin,不要动,修改path 增加 C:\JOB-4.3.4\\bin。
d) 开启 DOS窗口,进入JOB-4.3.4所在目录, 执行 ant -Dinstall.dir=C:\JOB-4.3.4, 我这里编译完成后放在 C:\JOB-4.3.4\, 里面有 bin, idl, lib 三个目录, 其中 bin目录从哪里来的呢? 是下载回来就有的, 自己仔细看看文档吧。
2。 编译完 JOB4.3.4后,如果想测试一下你的JOB, 去看看 ob目录下demo目录下的echo和hello,如果你简单设置独立classpath, 则可以运行client端的代码,但是server端的代码都会出错
让我们以hello为例子,以windows 7 为运行环境(linux上基本一样,我是指出错误的情况),参照readme说明
设置 运行环境
set CLASSPATH=..\..\lib;classes;%CLASSPATH%
java hello.Server
其中, ..\..\lib 为JOB的jar包, 8~9个, classes为当前运行目录下的hello 项目的classes文件所在目录,最后的那个%CLASSPATH%大家可以去掉。
在我的环境中式这样的
set CLASSPATH=.;classes;C:\JOB-4.3.4\lib\OB.jar;C:\JOB-4.3.4\lib\OBBalancer.jar;C:\JOB-4.3.4\lib\OBBiDir.jar;C:\JOB-4.3.4\lib\OBEvent.jar;C:\JOB-4.3.4\lib\OBIMR.jar;C:\JOB-4.3.4\lib\OBNaming.jar;C:\JOB-4.3.4\lib\OBProperty.jar;C:\JOB-4.3.4\lib\OBTime.jar;C:\JOB-4.3.4\lib\OBUDP.jar;C:\JOB-4.3.4\lib\OBUtil.jar;C:\JOB-4.3.4\lib\OBWatson.jar;C:\JOB-4.3.4\lib\OBTest.jar
Case1。 如果你看到这个错误
Exception in thread "main" java.lang.NoClassDefFoundError: hello/Server
Caused by: java.lang.ClassNotFoundException: hello.Server
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source);
Could not find the main class: hello.Server. Program will exit.
说明没有找到当前 hello 项目的类所在路径,解决方法是在hello这个工程目录里面执行 java hello.Server命令
例如: C:\workspace\JOB-4.3.4\ob\demo\hello> java hello.Server
Case2。 如果看到这个错误
Exception in thread "main" java.lang.NoSuchMethodError:org.omg.PortableInterceptor.IORInterceptor_3_0.adapter_manager_state_changed(Ljava/lang/String;S)V
at com.ooc.OB.PIManager.adapterManagerStateChange(Unknown Source)
at com.ooc.OBPortableServer.POAManager_impl.activate(Unknown Source)
at hello.Server.run(Unknown Source)
at hello.Server.main(Unknown Source)
这说明有个类找不到,可是我已经把所有的jar包都带着classpath里面了? Why? Faint。 用10分钟,google 一下。 原来问题在这里, readme里面说 (以windows为例, Linux一样的解决方法)
rem
rem Uncomment the following if using JDK1.4
rem
rem set BOOTCLASSPATH=-Xbootclasspath/p:"%CLASSPATH%"
其实应该是 if using JDK1.4 or later
所有说这个选项是必须的,故启动 server的时候必须这样
java -Xbootclasspath/p:%CLASSPATH% hello.Server
类似的情况还会出现在 eclipse里面调试 server端程序的时候, 需要你在 run configuration 里面, 在 vm参数里面加上 -Xbootclasspath/p:%CLASSPATH% , 由于classpath参数传不进去,所以我直接这样
-Xbootclasspath/p:C:\JOB-4.3.4\lib\OB.jar;C:\JOB-4.3.4\lib\OBBalancer.jar;C:\JOB-4.3.4\lib\OBBiDir.jar;C:\JOB-4.3.4\lib\OBEvent.jar;C:\JOB-4.3.4\lib\OBIMR.jar;C:\JOB-4.3.4\lib\OBNaming.jar;C:\JOB-4.3.4\lib\OBProperty.jar;C:\JOB-4.3.4\lib\OBTime.jar;C:\JOB-4.3.4\lib\OBUDP.jar;C:\JOB-4.3.4\lib\OBUtil.jar;C:\JOB-4.3.4\lib\OBWatson.jar;C:\JOB-4.3.4\lib\OBTest.jar
虽然丑了些,呵呵。
Case 3。 现在 Server也启动了, Client也启动了,为什么发送信息没有反应,过段时间Client端出这个错误
org.omg.CORBA.TRANSIENT: attempt to establish connection failed: java.net.ConnectException: Connection timed out: connect vmcid: 0x4f4f0000 minor code: 1 completed: No
at com.ooc.OCI.IIOP.Connector_impl.connect(Unknown Source)
at com.ooc.OB.GIOPClient.getWorker(Unknown Source)
at com.ooc.OB.GIOPClient.bind(Unknown Source)
at com.ooc.OB.DowncallStub.locate_request(Unknown Source)
at com.ooc.CORBA.Delegate._OB_getDowncallStub(Unknown Source)
at com.ooc.CORBA.Delegate.request(Unknown Source)
at org.omg.CORBA.portable.ObjectImpl._request(Unknown Source)
at hello._HelloStub.say_hello(Unknown Source)
at hello.Client.run(Unknown Source)
at hello.Client.main(Unknown Source)
呵呵, 真是点背啊,这种错误都有,简单,网络不通了, 自然是没有接网线吧?! 接上网络, 还会出现?! Faint。
仔细检查一下, 发现我这里是 NOD32 的防火墙把这个链接给干掉了, 解决方法是把防火墙上加个规则(端口号比较怪), 如果你不会的话,就临时把防火墙关闭一下也可以。
当然,高手在测试 hello例子的时候,可能直接看到
Client端显示
C:\workspace\JOB-4.3.4\ob\demo\hello>java hello.Client
Enter 'h' for hello, 's' for shutdown or 'x' for exit:
> h
> x
Server端显示
C:\workspace\JOB-4.3.4\ob\demo\hello>java -Xbootclasspath/p:%CLASSPATH% hello.Server
Hello World!
那就先恭喜你了!
至此, Orbacus Java 版本调试成功。 准备进入集成环境工作。
3。 Eclipse 安装
把下载回来的Zip包解压缩,我是放在 c:\eclipse 这里了。 进去,里面有个 eclipse.exe 执行它就ok, 如果出现错误,检查JDK, 通常注意 32 位环境下, eclipse和jdk都要是32位的就可以, 64位系统下, 要保持 eclipse和jdk是一致的就可以。 如果怎么折腾都不行的话, 重新安装系统,再来就OK了。这种情况通常跟人品有关系。
4。 安装 orbstudio
orbstudio其实是个 eclipse corba开发插件,目前是 7.7.7版本, 没有必要去试验老版本了。 我的习惯就是用新版本的。最初我是为了找个 eclipse 下面的 IDL 编译插件, 结果发现了这个宝贝。 安装过程非常简单,先关闭eclipse,从 777 的压缩包里面把 ORBStudio_7.7.7.jar 找到并扔到 eclipse 的plugins 目录里面, 在我的环境中如下:
解压缩 orbastuio 777, 把C:\360Downloads\ORBStudio777\ORBStudio\plugins\ORBStudio_7.7.7.jar 复制到 C:\eclipse\plugins 。 重启eclipse 就ok了。 在 windwos菜单中preferences 里面多了个 ORB Studio 菜单吧。 如果没有看到这个菜单的话,多半是因为你没有关闭 eclipse, 先关闭再复制。 多试试吧,一定会出来的,这个可以有的。
5。 eclipse中orbsutio中增加 orbacus
在下拉菜单Window的Preferences项里找到ORB Studio—>IDL Compiler , 好可怜, 有 IONA Orbix, JacORB, Sun Java IDL, OpenORB, visiBroker, 就是没有 orbacus。。。 怎么办? 天无绝人之路, 其实这就是个 IDL编译器吗, 运行环境就是 idl xxx.idl , 没有什么复杂的。 先学习一下(IDL Compiler前面有个小箭头,是可以点开的):
看看 Sun JavaIDL是怎么写的
第一行:idlj /* 在 jdk的目录里面 */
第二行:-fall -fallTIE -td %D% %F% /* D 代表目录, F代码输入的idl文件,我猜测的, TIE代表POA Tie的代理模式,这个可以有的 */
类推 orbacus 的写法应该是
第一行 : jidl
第二行 : --output-dir %D% --tie --impl %F%
剩下的工作就是选个你不想用的做个替换吧, 我这里是把IONA Orbix替换掉了,毕竟他们现在是一家人了。这样在后继的工作中大家编译 idl 的时候就选 IONA Orbix 就可以了。
jidl 在 C:\JOB-4.3.4\\bin, 上面这样做的时候,你最后在 path 里面增加 C:\JOB-4.3.4\bin, 否则会出问题。
6。 开发环境配置好了,现在做Demo
a) 在eclipse里新建项目,Java Project
b) 给新项目添加Libraries,右键Properites—>Libraries—>Add External Jars 把 C:\JOB-4.3.4\lib 里面的 jar文件都选上吧,其实做实验只要增加 OB.jar, 我这个人比较懒,都加上了, 咱不差钱,这个可以有。
c)src上右键New—>Other—>CORBA Wizard—>IDL files—>Simple IDL;
这里先注意一下,打开这个文件,对着这个文件猛击鼠标左键
出现
module MyServer {
interface MyService {
void operation1(in string msg);
};
};
这里可以根据你的情况,把MyServer修改为你的package名字,从而简化你的命名管理,当然后期重构也可以,我这里修改如下(你可以不改,这个可以没有)
module test {
interface MyService {
void operation1(in string msg);
};
};
d) 选择IDL文件,右键ORB Menu—>Compile ,则会在 src 下面生成 MyServer或者 test 的子目录, 有的地方说要把生成的MyServer包移动到src目录下, 这种情况在 我这里不会发生,如发生了就移动下吧, 正常的话,应该生成了 8 个java文件。
e) src上右键New—>Other—>CORBA Wizard—>Server—>Default Servant—>Next
在弹出的对话框里IDL filename栏选择/{projectName}/src/{IDLname}.idl
Interface栏选择IDL文件里定义的接口名
Package栏里填写包名, 这里的包名可以进行区分,例如选择 server,如果你也选择 test, 那么产生的文件就会跟 idl编译出来的文件放在一起,你喜欢这样吗?
Server classname栏里填写服务端类名, 我都懒得改了。
—>Next 在弹出的对话框,选中Create server class:项打钩, create tie 估计你现在用不着,空着吧。
f) 为生成的服务端类添加未实现的方法,并填写方法体, 否则你会看到有个红叉叉, 不要慌, 不知道怎么办了吧? 在eclipse里面鼠标悬停在出错的地方, 很快句有提示了吧, 选择add unimplement method,自动增加一个空方法,爽啊。
g) src上右键New—>Other—>CORBA Wizard—>Client—>Simple implementation 在弹出的对话框里IDL filename栏选择/{projectName}/src/{IDLname}.idl
Interface栏选择IDL文件里定义的接口名
Package栏里填写包名, 我这里一般填写 client
Client classname栏里填写客户端类名
h)在客户端类的main方法里,取消注释test.getORBInterface().operation1("A message in the bottle…"); 并修改传递的String内容
i)至此,我的 src目录里面 有 client,server和 test 三个目录
j)去 Run -> run configurations, 增加一个 startServer 的启动项, 在 arguments 的 vm arguments里面增加前面说过的 -Xbootclasspath 参数,main里面填写上 Server_DefaultServant,当然前面有包名,我这里就不写了。
j)运行服务端程序,通过 startServer 来启动 Server_DefaultServant.java,然后再运行客户端程序MyServiceClientImpl.java。 当然,两个不能同时在 Eclipse里面玩, 去外面另外启动一个 dos窗口吧, 现在明白了为什么最还是要测试一下 JOB的工作了吧, 有了前面的测试基础,现在你就轻松了。
如果,你要将你的程序包发布到别的机器上,就要用到名称服务,使用名称服务,参见其它的文章吧, 这是一个新的开始,真正了解和学习的开始, 去更多地了解Corba,从现在开始。
Good luck, Save yourself.
By Dr.Cat, Call me BFcat is OK.
2010 年的寂寞中秋,独自徘徊在广州。
---------------------------------------------------------------------
说明: 本文没有图片,方便转载,欢迎转载。 请注明 JavaEye