jacorb总结

来源:互联网 发布:apache下载64位安装版 编辑:程序博客网 时间:2024/06/01 21:15
一、使用到的软件 
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文件拷贝到eclipseplugins目录。 
 
三、安装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.0jacORB-bin\bin 下面的jacojaco.bat后面都带一个后缀".tpl",最后终于知道这个tpltemplate!删除所有.tpl后缀!再把jaco.bat中的JAVA_CMD@替换成JAVA 
 
 
四、在eclipse里面配置ORB StudioJacORB 
eclipse的菜单栏中,选【windows->[preferences]->[ORB Studio]->[IDL Compiler],选中JacORB 
然后展开[IDL Compiler],设置JacORBIDL CommandCommand 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_HOMEC:\ apache-ant-1.7.0  
path
%ANT_HOME%\bin 
然后在命令行下找到工程的idl文件的目录,在目录里必须有构建文件build.xml才可以编译,其写法见附录 
在命令行输入ant命令,即可编译,同样可以生成上面的7个文件,再将其导入到eclipse工程里。 
(三)用jacorbidl命令: 
在命令行下进入jacorbbin目录,输入命令:idl c:\demo.idl,这时就会在bin目录中产生以上7java文件,导入到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
、创建ServerClient(服务器端和客户端)程序 
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)本地调用: 
运行JacORBns 
ns
 
这时ns把服务的信息写在了c:\NS_Ref文件里 
运行ServerClient 
进入代码目录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>