由于公司新项目要求,做了一段时间的CORBA接口(中兴+华为)开发,踩了各种大大小小的坑,也算积累了一些经验,特分享至此,经验所限难免会有疏漏,欢迎讨论完善。
一、CORBA技术说明
CORBA(Common Object Request Broker Architecture,公共对象请求代理体系)是吸收了软件界面向对象技术、分布式计算技术、多层体系结构技术以及接口技术的一种综合技术,是一种对象间通信的工业标准。
CORBA规范包含:
- 接口定义语言 (IDL, Interface Definition Language)
- IDL语言和高级编程语言之间的映射
- IIOP(Internet Inter-ORB Protocol)通信协议
- 可透过网络传递的对象引用格式
CORBA的基本特征:
- 跨平台、跨语言、跨ORB(Object Request Broker)的互操作性
- 即插即用的分布式特性
二、JacORB安装配置
1、到http://www.jacorb.org/download.html下载合适的版本并解压到本地,我选用的是JacORB-2.2.4版本。
本地目录:D:\Programming\JAR\JacORB\JacORB-2.2.4
2、设置环境变量
确保有java环境和JAVA_HOME变量,我本地使用的是Java6环境。
添加D:\Programming\JAR\JacORB\JacORB-2.2.4\bin到环境变量path
创建JACORB_HOME变量为D:\Programming\JAR\JacORB\JacORB-2.2.4
ps:此处也可以不用设置系统环境变量,直接在idl.bat里设置。
3、修改idl.bat
%JACORB_HOME%\bin目录下会自带一个idl.bat的文件,该文件只是一个示例,需要修改文件内容。
原内容:
@echo off
java -classpath "C:\JacORB-2.2.4\lib\idl.jar;C:\JacORB-2.2.4\lib\logkit-1.2.jar;%CLASSPATH%" org.jacorb.idl.parser %*
修改后【我自己的版本】:
@echo off
rem @JAVA_CMD@ -classpath "@JACORB_HOME@/lib/idl.jar;@JACORB_HOME@/lib/logkit-1.2.jar;%CLASSPATH%" org.jacorb.idl.parser %*
set JACORB_HOME=D:/Programming/JAR/JacORB/JacORB-2.2.4
set JAVA_HOME=D:/Programming/JDK/jdk1.6.0_31
set path=%JAVA_HOME%/bin;%path%
set CLASSPATH=%JAVA_HOME%/lib/rt.jar
set CLASSPATH=%JACORB_HOME%/lib/antlr-2.7.2.jar;%JACORB_HOME%/lib/avalon-framework-4.1.5.jar;%JACORB_HOME%/lib/concurrent-1.3.2.jar;%JACORB_HOME%/lib/idl.jar;%JACORB_HOME%/lib/jacorb.jar;%JACORB_HOME%/lib/logkit-1.2.jar;%JACORB_HOME%/lib/picocontainer-1.2-021105.jar;%JACORB_HOME%/lib/wrapper-3.1.0.jar;%JACORB_HOME%/classes;%CLASSPATH%
%JAVA_HOME%/bin/java -cp %CLASSPATH% org.jacorb.idl.parser %*
4、在%JACORB_HOME%\bin目录执行命令行 idl -h,显示帮助信息,说明已配置完成。
D:\Programming\JAR\JacORB\JacORB-2.2.4\bin>idl -h
-h|help these few lines of help
-v|version print version information
-d dir root of directory tree for output
-Dx define preprocessor symbol x with value 1
-Dx=y define preprocessor symbol x with value y
-Idir set include path for idl files
-U<symbol> undefine preprocessor symbol
-W [1..4] debug level
-all generate code for all IDL files, even included ones
-forceOverwrite generate code even if IDL has not changed
-ami_callback generate AMI reply handlers and sendc methods
-ami_polling generate AMI poller and sendp methods
-backend classname use classname as code generator
-i2jpackage x:a.b.c replace IDL package name x by a.b.c in generate
d Java code (e.g. CORBA:org.omg.CORBA)
-i2jpackagefile <filename> replace IDL package names using list fr
om <filename>. Format as above.
-ir generate information required by the Interface Repositor
y
-nofinal generated Java code will contain no final class definiti
ons
-unchecked_narrow use unchecked_narrow in generated code f
or IOR parameters in operations
-noskel disables generation of POA skeletons
-nostub disables generation of client stubs
-cldc10 code generation compatible with J2ME/CLDC 1.0
-sloppy_forward allow forward declarations wo. later definitions
-sloppy_names less strict checking of module name scoping
-permissive_rmic tolerate dubious IDL generated by JDK's rmic, in
cludes -sloppy_names.
-syntax syntax check only, no code generation
<filelist>
三、编译IDL文件
执行以下命令:
#编译中兴IDL
#D:\Programming\JAR\JacORB\JacORB-2.2.4\idl\omg 是编译中兴idl时要依赖的idl文件
#D:\idl\zhongxing\*.idl是中兴idl文件目录
#org.omg.zx是中兴idl编译生成的java服务端接口文件的包名
#c:/corba/zx 是生成中兴idl服务端接口文件所在的目录
idl -all -d c:/corba/zx -ID:\Programming\JAR\JacORB\JacORB-2.2.4\idl\omg -i2jpackage :org.omg.zx -in D:\idl\zhongxing\*.idl
#编译华为IDL
#D:\idl\huawei\OMG 是编译华为idl时要依赖的idl文件
#D:\idl\huawei\*.idl是华为idl文件目录
#org.omg.zx是华为idl编译生成的java服务端接口文件的包名
#c:/corba/hw 是生成华为idl服务端接口文件所在的目录
idl -all -d c:/corba/hw -ID:\idl\huawei\OMG -i2jpackage :org.omg.hw -in D:\idl\huawei\*.idl
IDL编译完成后即可在c:/corba/zx和c:/corba/hw目录下看到对应的java接口文件,将org.omg.zx和org.omg.hw两个目录都导入项目中就可以开始corba接口的开发了。