JacORB是OMG corba的Java实现,用于开发分布式应用。本文将详细介绍如何在Eclipse下搭建JacORB开发环境。
一、安装JacORB
首先下载Jacorb发行包,到JacORB官网下载jacORB发行版本,建议选择编译好的(源码版需要使用ant编译),本文作者选择的是 jacorb-3.4-binary.zip。
接着把jacorb添加到系统环境变量,解压文件包到某一路径,比如 E:\JacORB\jacorb-3.4, 然后将E:\JacORB\jacorb-3.4\bin添加到path环境变量
接下来配置jacorb名字服务,将E:\JacORB\jacorb-3.4\etc路径下jacorb_properties.template文件更名为jacorb.properties,然后用文本编辑器打开找到ORBInitRef.NameService=file:/c:/NS_Ref ,去掉其前面的注释符并把其它的选择注释掉。这一步是设置ior文件存放路径,里面有服务的ip地址及端口信息等,用dior –f c:/NS_Ref命令可以解析这个ior文件以得到ip地址及端口号。
至此,jacorb安装完毕,打开命令行窗口,输入ns,即可启动名字服务NameService
NameService的启动参数如下:
ns [-Djacorb.naming.ior filename=<filename>] [-DOAPort=port] [-Djacorb.naming.time out=<timeout>]
一般会指定端口,即第二个参数
注意:如果NameService所在机器有多个IP地址,即多宿主机器,那么在没有指定所用IP地址的情况下,系统会自行选择,这时可以通过dior –f c:/NS_Ref来查看NameService所用IP地址。
二、安装Eclipse的JacORB开发插件
首先在下JacORB的Eclipse插件ORBStudio_7.7.7.jar并安装。
安装Eclipse的方法有多种,这里采用最简单的方式,将ORBStudio_7.7.7.jar文件拷贝到eclipse的plugins目录。
接下来就是配置ORBStudio_7.7.7插件,配置内容如下:
在eclipse的菜单栏中,选【windows】->[preferences]->[ORB Studio]->[IDL Compiler],选中JacORB。然后展开[IDL Compiler],设置JacORB的IDL Command和Command Options。
默认参数为
IDL Command:java
Command Options:-cp "/Tools/JacORB/lib/idl.jar;/Tools/JacORB/lib/logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%
这里有两中配置是,
第一种是在默认参数的基础上将Command Options的内容改为正确的路径即可
Command Options:-cp "E:/JacORB/jacorb-3.4/lib/idl.jar;E:/JacORB/jacorb-3.4/lib/logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%
第二种如下
IDL Command:E:\JacORB\jacorb-3.4\bin\idl.bat
Command Options:-d %D% %F%
保存即配置完毕
三、Eclipse下Jacorb开发步骤
1)新建Java项目
2)在项目上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL,建立一个IDL文件,如demo.idl
3)编译IDL文件,右键点击demo.idl文件,选[ORB Menu]->[Compile],会生成demo.hello包,里面包含7个自动生成的文件
4)编写服务端,在项目上右键New--->Other--->CORBA Wizard--->Server--->Active object map,然后数据Package名即可(Package名和Server Class名都可以自定义)
这里也可以手动创建服务端
5)编写客户端,在项目上右键New--->Other--->CORBA Wizard--->Client--->....。当然也可以手动创建
四、服务端和客户端关键代码
1)服务端
服务端主要包括一个对之前在IDL文件中定义的借口的实现类(XXXServiceImpl.java),和一个Server类
XXXServiceImpl.java的实现与本地编程无异。
Server类用于关联XXXServiceImpl.java和JacORB提供的机制,具体的实现又有两种,一种是使用NameService,另一种是采用IOR文件来传递Object信息。这里介绍前者,后者没有技术难度。(后者即使在服务端将服务对象的信息输出到文件,客户端读取这个文件,从中获得服务对象的信息,从而实访问)
//首先,初始化ORB,注意参数192.168.1.101::8893分别是NameService的IP地址和端口
Properties props = System.getProperties();
//props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
//props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
props.put("org.omg.CORBA.ORBInitRef.NameService", "corbaloc::192.168.1.101::8893/NameService");
orb = org.omg.CORBA.ORB.init((String[])args, props);
//下面这种参数连接到的是Java(Sun)所提供的orbd名字服务器,不是JacORB所提供的NameService,注意
//props.put("org.omg.CORBA.ORBInitialHost", "192.168.1.101");
//props.put("org.omg.CORBA.ORBInitialPort", "8893");
//接下来初始化POA
POA poa =
POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
poa.the_POAManager().activate();
// 创建服务对象
GoodDayServerImpl goodDayImpl = new GoodDayServerImpl( );
// 创建服务对象的Corba引用
org.omg.CORBA.Object objGoodDay = poa.servant_to_reference(goodDayImpl);
GoodDay gref = GoodDayHelper.narrow(objGoodDay);
// 获得NameService的Context
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(objRef);
//服务对象的名称
String goodDayName = "GoodDayService";
//将服务对象引用和服务对象名称进行绑定
NameComponent path[] = nc.to_name(goodDayName);
nc.rebind(path, gref);
//启动服务
orb.run();
2)客户端关键代码
// 创建和初始化ORB,同样192.168.1.101::8893分别为NameService的IP地址和端口
Properties props = new Properties();
//props.setProperty("org.omg.CORBA.ORBClass", "org.jacorb.orb.ORB");
//props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
props.put("org.omg.CORBA.ORBInitRef.NameService", "corbaloc::192.168.1.101::8893/NameService");
ORB orb = ORB.init(args, props);
// 获得代表命名服务的Context
org.omg.CORBA.Object objRef = orb
.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// 获得名为"GoodDayService"的GoodDay对象的远程引用
String targetName = "GoodDayService";
remoteTarget = GoodDayHelper.narrow(ncRef
.resolve_str(targetName));
接下来就可以通过remoteTarget引用像在本地一样使用GoodDay所提供的方法了