一、使用到的软件
JacORB 2.3
Eclipse SDK 3.1
JDK5 1.4
ORB Studio 7.7.7
使用的系统为 Windows XP SP2 。版本号可能不一定要完全按照上面,但是如果你配置成功不了,不妨就按上面来弄。
二、为eclipse安装corba开发插件。
ORB Studio 是开发 corba 的插件,用于 eclipse 。
安装其实很简单,把 ORBStudio_7.7.7.jar 文件拷贝到 eclipse 的 plugins 目录。
三、安装JacORB
解压到磁盘 例如: c:\JacORB ,在 c:\jacORB 下新建个文件夹 classes ,为了在调试时可以找到有关包 , 需要在系统环境变量中设置
JACORB_HOME=C:\JacORB
path=%JACORB_HOME%\bin
classpath=.;%JACORB_HOME%\lib\idl.jar;%JACORB_HOME%\lib\jacorb.jar;%JACORB_HOME%\lib\logkit-1.2.jar;%JACORB_HOME%\lib\avalon-framework-4.1.5.jar;%JACORB_HOME%\classes
把 c:\JacORB\etc 中的 jacorb_properties.template 复制到 c:\JacORB\classes 下,并更名为 jacorb.properties 。编辑 jacorb.properties 文件,设置 ORBInitRef.NameService=file:/c:/NS_Ref 这个文件是启动服务时生成的 ior 文件,里面有服务的 ip 地址及端口信息等,用 dior –f c:/NS_Ref 命令可以解析这个 ior 文件以得到 ip 地址及端口号。
在 dos 窗口下 输入 ns 启动服务
※ 这里有个问题,下载下来的 latest 版本的 2.3.0 的 jacORB-bin\bin 下面的 jaco 和 jaco.bat 后面都带一个后缀 ".tpl" ,最后终于知道这个 tpl 是 template !删除所有 .tpl 后缀!再把 jaco.bat 中的 JAVA_CMD@ 替换成 JAVA
四、在eclipse里面配置ORB Studio和JacORB。
在 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%
第二个参数要设置成正确的路径。
-cp "C:\jacORB\lib\idl.jar;D:\JavaTools\JacORB-2.3.0\lib\logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%
五、corba程序示例一个简单的例子hello
以下操作在 eclipse 中进行,创建一个 java 工程,给新项目添加 Libraries, 右键 Properites--->Libraries--->Add Library--->User Library
--->User Libraries...--->New...--->Add JARs...
找到 OpenOrb\OpenORB\lib 目录下 openorb_orb-1.4.0.jar,openorb_orb_tools-1.4.0.jar
OpenOrb\OpenORB\lib\endorsed 目录下 openorb_orb_omg-1.4.0.jar
OpenOrb\tools\lib 目录下所有 .jar 文件。
1 、src上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL,建立一个IDL文件,如demo.idl
module demo
{
module hello {
interface GoodDay {
string hello_latin1();
wstring hello_chinese();
};
};
};
2 、编译idl文件,有三种方法:
(一)右键点击 demo.idl 文件,选 [ORB Menu]->[Compile] ,会生成 demo.hello 包,里面包含 7 个自动生成的文件
_GoodDayStub.java
GoodDay.java
GoodDayHelper.java
GoodDayHolder.java
GoodDayOperations.java
GoodDayPOA.java
GoodDayPOATie.java
(二)使用 ant 工具包,
下载 apache-ant-1.7.0-bin.tar
解压到磁盘 例如: C:\ apache-ant-1.7.0
设置环境变量: ANT_HOME = C:\ apache-ant-1.7.0
path = %ANT_HOME%\bin
然后在命令行下找到工程的 idl 文件的目录,在目录里必须有构建文件 build.xml 才可以编译,其写法见 附录 。
在命令行输入 ant 命令,即可编译,同样可以生成上面的 7 个文件,再将其导入到 eclipse 工程里。
(三)用 jacorb 的 idl 命令:
在命令行下进入 jacorb 的 bin 目录,输入命令: idl c:\demo.idl ,这时就会在 bin 目录中产生以上 7 个 java 文件,导入到 eclipse 中即可
3、实现demo.idl文件hello模块中GoodDay接口,手动创建GoodDayImpl.java文件
package demo.hello;
public class GoodDayImpl extends GoodDayPOA {
public String hello_chinese() {
// TODO Auto-generated method stub
return " 你好 , 世界 ";
}
public String hello_latin1() {
// TODO Auto-generated method stub
return "Hello, World";
}
}
4 、创建Server和Client(服务器端和客户端)程序
Server.java
//
package demo.hello;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
public class Server {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null); // 初始化 ORB
POA poa = POAHelper.narrow(orb
.resolve_initial_references("RootPOA")); // 初始化 POA
poa.the_POAManager().activate();
// 创建一个 GoodDay 对象
GoodDayImpl goodDayImpl = new GoodDayImpl();
// 创建 GoodDay 对象的引用
org.omg.CORBA.Object obj = poa.servant_to_reference(goodDayImpl);
// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
nc.bind(nc.to_name("hello.goodDay"), obj); // 绑定对象
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client.java
//
package demo.hello;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
public class Client {
public static void main(String[] args) {
try{
GoodDay goodDay;
ORB orb = ORB.init(args, null); // 初始化 ORB
// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
org.omg.CORBA.Object obj = nc.resolve(nc.to_name("hello.goodDay")); // 解析对象
goodDay = GoodDayHelper.narrow(obj); // 转换
// GoodDay 接口调用
System.out.println(goodDay.hello_latin1());
System.out.println(goodDay.hello_chinese());
}catch(Exception e) {
e.printStackTrace();
}
}
}
5 、运行程序
(1)本地调用:
运行 JacORB 的 ns
ns
这时 ns 把服务的信息写在了 c:\NS_Ref 文件里
运行 Server 和 Client
进入代码目录 demo 的上级目录 ( 例如: cd E:\workspace\CorbaTest\bin) ,运行下面的代码
start jaco demo.hello.Server
start jaco demo.hello.Client
同样,如果后面没有参数,则程序会自动去 c:\NS_Ref 文件里查找服务信息,然后再运行
(二)远程调用:
修改代码:
将 Server 中的
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
nc.bind(nc.to_name("hello.goodDay"), obj); // 绑定对象
改为:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
nc.rebind(nc.to_name("hello.goodDay"), obj); // 绑定对象
再将 Client 中的
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
改为:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
启动 ns
在命令行输入 dior –f c:\NS_Ref ,来解析 ior 文件,看到 ip 地址和端口号,将这两个信息写入到 java 程序中:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
如果写成读取配置文件的形式更方便。
然后在命令行下运行
start jaco demo.hello.Server
start jaco demo.hello.Client
即可
附:build.xml文件详解
<?xml version="1.0" encoding="GB2312" ?>
<!--
文档结构为 :
<project>
<property/> 全局变量的定义
<property/>...
<target name="1"> 任务组 (tasks)
<javac></javac> 一项 javac 编译任务
...
<oneTask></ontTask> 一项其它任务
</target>
<target name="2">
<javac></javac>
...
<oneTask></ontTask>
</target>
</project>
project 代表一个项目,
default: 运行到名称为 "dist" 的 target( 任务组 )
basedir: 基准路径。
-->
本例子的build.xml代码如下:
<?xml version="1.0"?>
<!DOCTYPE project [ <!ENTITY common SYSTEM "file:../../etc/common.xml"> ]>
<project name="demo" default="idl" basedir="../..">
&common;
<!-- ==================================================== -->
<!-- Demo build file -->
<!-- ==================================================== -->
<target name="helloinit" depends="init">
<property name="name" value="hello"/>
<property name="dirs.base" value="${basedir}"/>
<property name="classdir" value="${dirs.base}/classes"/>
<property name="lib" value="${dirs.base}/lib"/>
<property name="dest" value="${dirs.base}/demo/${name}/generated"/>
<property name="include" value="${dirs.base}/idl/omg"/>
</target>
<target name="idl" depends="helloinit,load-taskdef">
<mkdir dir="${dest}" />
<jacidl srcdir="demo/${name}"
destdir="${dest}"
includepath="${include}"
includes="*.idl"/>
</target>
</project>
JacORB 2.3
Eclipse SDK 3.1
JDK5 1.4
ORB Studio 7.7.7
使用的系统为 Windows XP SP2 。版本号可能不一定要完全按照上面,但是如果你配置成功不了,不妨就按上面来弄。
二、为eclipse安装corba开发插件。
ORB Studio 是开发 corba 的插件,用于 eclipse 。
安装其实很简单,把 ORBStudio_7.7.7.jar 文件拷贝到 eclipse 的 plugins 目录。
三、安装JacORB
解压到磁盘 例如: c:\JacORB ,在 c:\jacORB 下新建个文件夹 classes ,为了在调试时可以找到有关包 , 需要在系统环境变量中设置
JACORB_HOME=C:\JacORB
path=%JACORB_HOME%\bin
classpath=.;%JACORB_HOME%\lib\idl.jar;%JACORB_HOME%\lib\jacorb.jar;%JACORB_HOME%\lib\logkit-1.2.jar;%JACORB_HOME%\lib\avalon-framework-4.1.5.jar;%JACORB_HOME%\classes
把 c:\JacORB\etc 中的 jacorb_properties.template 复制到 c:\JacORB\classes 下,并更名为 jacorb.properties 。编辑 jacorb.properties 文件,设置 ORBInitRef.NameService=file:/c:/NS_Ref 这个文件是启动服务时生成的 ior 文件,里面有服务的 ip 地址及端口信息等,用 dior –f c:/NS_Ref 命令可以解析这个 ior 文件以得到 ip 地址及端口号。
在 dos 窗口下 输入 ns 启动服务
※ 这里有个问题,下载下来的 latest 版本的 2.3.0 的 jacORB-bin\bin 下面的 jaco 和 jaco.bat 后面都带一个后缀 ".tpl" ,最后终于知道这个 tpl 是 template !删除所有 .tpl 后缀!再把 jaco.bat 中的 JAVA_CMD@ 替换成 JAVA
四、在eclipse里面配置ORB Studio和JacORB。
在 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%
第二个参数要设置成正确的路径。
-cp "C:\jacORB\lib\idl.jar;D:\JavaTools\JacORB-2.3.0\lib\logkit-1.2.jar" org.jacorb.idl.parser -d %D% %F%
五、corba程序示例一个简单的例子hello
以下操作在 eclipse 中进行,创建一个 java 工程,给新项目添加 Libraries, 右键 Properites--->Libraries--->Add Library--->User Library
--->User Libraries...--->New...--->Add JARs...
找到 OpenOrb\OpenORB\lib 目录下 openorb_orb-1.4.0.jar,openorb_orb_tools-1.4.0.jar
OpenOrb\OpenORB\lib\endorsed 目录下 openorb_orb_omg-1.4.0.jar
OpenOrb\tools\lib 目录下所有 .jar 文件。
1 、src上右键New--->Other--->CORBA Wizard--->IDL files--->Simple IDL,建立一个IDL文件,如demo.idl
module demo
{
module hello {
interface GoodDay {
string hello_latin1();
wstring hello_chinese();
};
};
};
2 、编译idl文件,有三种方法:
(一)右键点击 demo.idl 文件,选 [ORB Menu]->[Compile] ,会生成 demo.hello 包,里面包含 7 个自动生成的文件
_GoodDayStub.java
GoodDay.java
GoodDayHelper.java
GoodDayHolder.java
GoodDayOperations.java
GoodDayPOA.java
GoodDayPOATie.java
(二)使用 ant 工具包,
下载 apache-ant-1.7.0-bin.tar
解压到磁盘 例如: C:\ apache-ant-1.7.0
设置环境变量: ANT_HOME = C:\ apache-ant-1.7.0
path = %ANT_HOME%\bin
然后在命令行下找到工程的 idl 文件的目录,在目录里必须有构建文件 build.xml 才可以编译,其写法见 附录 。
在命令行输入 ant 命令,即可编译,同样可以生成上面的 7 个文件,再将其导入到 eclipse 工程里。
(三)用 jacorb 的 idl 命令:
在命令行下进入 jacorb 的 bin 目录,输入命令: idl c:\demo.idl ,这时就会在 bin 目录中产生以上 7 个 java 文件,导入到 eclipse 中即可
3、实现demo.idl文件hello模块中GoodDay接口,手动创建GoodDayImpl.java文件
package demo.hello;
public class GoodDayImpl extends GoodDayPOA {
public String hello_chinese() {
// TODO Auto-generated method stub
return " 你好 , 世界 ";
}
public String hello_latin1() {
// TODO Auto-generated method stub
return "Hello, World";
}
}
4 、创建Server和Client(服务器端和客户端)程序
Server.java
//
package demo.hello;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
public class Server {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null); // 初始化 ORB
POA poa = POAHelper.narrow(orb
.resolve_initial_references("RootPOA")); // 初始化 POA
poa.the_POAManager().activate();
// 创建一个 GoodDay 对象
GoodDayImpl goodDayImpl = new GoodDayImpl();
// 创建 GoodDay 对象的引用
org.omg.CORBA.Object obj = poa.servant_to_reference(goodDayImpl);
// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
nc.bind(nc.to_name("hello.goodDay"), obj); // 绑定对象
orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Client.java
//
package demo.hello;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
public class Client {
public static void main(String[] args) {
try{
GoodDay goodDay;
ORB orb = ORB.init(args, null); // 初始化 ORB
// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
org.omg.CORBA.Object obj = nc.resolve(nc.to_name("hello.goodDay")); // 解析对象
goodDay = GoodDayHelper.narrow(obj); // 转换
// GoodDay 接口调用
System.out.println(goodDay.hello_latin1());
System.out.println(goodDay.hello_chinese());
}catch(Exception e) {
e.printStackTrace();
}
}
}
5 、运行程序
(1)本地调用:
运行 JacORB 的 ns
ns
这时 ns 把服务的信息写在了 c:\NS_Ref 文件里
运行 Server 和 Client
进入代码目录 demo 的上级目录 ( 例如: cd E:\workspace\CorbaTest\bin) ,运行下面的代码
start jaco demo.hello.Server
start jaco demo.hello.Client
同样,如果后面没有参数,则程序会自动去 c:\NS_Ref 文件里查找服务信息,然后再运行
(二)远程调用:
修改代码:
将 Server 中的
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
nc.bind(nc.to_name("hello.goodDay"), obj); // 绑定对象
改为:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
nc.rebind(nc.to_name("hello.goodDay"), obj); // 绑定对象
再将 Client 中的
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
改为:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
启动 ns
在命令行输入 dior –f c:\NS_Ref ,来解析 ior 文件,看到 ip 地址和端口号,将这两个信息写入到 java 程序中:
org.omg.CORBA.Object ncobj = orb.string_to_object("corbaloc::1.2@192.168.1.108:2285/NameService");
如果写成读取配置文件的形式更方便。
然后在命令行下运行
start jaco demo.hello.Server
start jaco demo.hello.Client
即可
附:build.xml文件详解
<?xml version="1.0" encoding="GB2312" ?>
<!--
文档结构为 :
<project>
<property/> 全局变量的定义
<property/>...
<target name="1"> 任务组 (tasks)
<javac></javac> 一项 javac 编译任务
...
<oneTask></ontTask> 一项其它任务
</target>
<target name="2">
<javac></javac>
...
<oneTask></ontTask>
</target>
</project>
project 代表一个项目,
default: 运行到名称为 "dist" 的 target( 任务组 )
basedir: 基准路径。
-->
本例子的build.xml代码如下:
<?xml version="1.0"?>
<!DOCTYPE project [ <!ENTITY common SYSTEM "file:../../etc/common.xml"> ]>
<project name="demo" default="idl" basedir="../..">
&common;
<!-- ==================================================== -->
<!-- Demo build file -->
<!-- ==================================================== -->
<target name="helloinit" depends="init">
<property name="name" value="hello"/>
<property name="dirs.base" value="${basedir}"/>
<property name="classdir" value="${dirs.base}/classes"/>
<property name="lib" value="${dirs.base}/lib"/>
<property name="dest" value="${dirs.base}/demo/${name}/generated"/>
<property name="include" value="${dirs.base}/idl/omg"/>
</target>
<target name="idl" depends="helloinit,load-taskdef">
<mkdir dir="${dest}" />
<jacidl srcdir="demo/${name}"
destdir="${dest}"
includepath="${include}"
includes="*.idl"/>
</target>
</project>