Java IDLのFAQ

このドキュメントはJava IDLテクノロジの使用に関する質問にお答えするためのものです。

エラー

機能

互換性と相互運用性

一般

エラー

HelloServerを実行しようとすると次のようなメッセージが表示されるのはなぜですか。"Exception in thread "main" java.lang.NoClassDefFoundError: HelloServer/java"

多くの場合、Java IDLチュートリアルのHelloServer (HelloClientの場合も同様)を実行すると、このエラーが発生するのは、HelloServerがクラス・パスに含まれていないためです。クラス・パス変数の設定方法の詳細は、「クラス・パスの設定」を参照してください。

2番目に多い原因は、次のコード行の引用符と引用符の間に空白が追加されていることです。

NameComponent nc = new NameComponent("Hello", "");

引用符の間には空白を入れないでください。空白がなければ、この値はNullとして渡されます。引用符の間に空白があると、空白文字が渡されます。

今回のリリースで既存のプログラムを実行できません。互換性に問題があるのですか。

J2SE 1.4.xとJ2SE 5.0の間の互換性に関する情報は、「CORBAの互換性情報 - J2SE 5.0」を参照してください。

IORに127.0.0.0のホスト・アドレスが含まれていると、LinuxサーバーからIORを使用して接続できません。なぜですか。

Red Hat Linuxをインストールした場合、InetAddress.getLocalHost()が、ループバック・アドレス(127.0.0.1)に対応するInetAddressを返すことがあります。この問題が発生するのは、デフォルトのインストールによって、マシンのホスト名とループバック・アドレスとの関連付けが/etc/hosts内に作成されるためです。InetAddress.getLocalHost()によって確実に実際のホスト・アドレスが返されるようにするには、/etc/hostsファイルまたはネーム・サービスの構成ファイル(/etc/nsswitch.conf)を更新して、ホストを検索する前に、dnsまたはnisに問い合わせるようにします。

マイナー・コードの意味はどうすればわかりますか。

最新バージョンの標準(OMG)マイナー・コード例外については、OMGのWebサイト(http://www.omg.org/)を参照してください。

よく遭遇するSunのマイナー・コード例外には、次のようなものがあります。

servertoolを使用してサーバーを起動するとき、複数のクラス・パスを追加できますか。

この質問は、もともと次のような内容でした。私のサーバー・コードでは、クラス・パスに複数のJARファイルが必要です。そこで、servertoolを使用してサーバーを登録するときにクラス・パスを指定しようとしたのですが、registerコマンドで構文エラーが起こります。使用したコマンド行の長さが制限を超えているように思われます。

servertoolでサーバーを登録するとき、非常に長いクラス・パスを指定するにはどうしたらよいのでしょうか。

servertoolそのものは複数のJARファイルを受け付けるのですが、現在のところ、servertoolのコマンド行バッファの長さに関してバグがあります。servertoolラッパーのバグ(4482166)の詳細を参照してください。

回避策として、servertool内からサーバーを起動する代わりに、ServerToolクラスを呼び出してサーバーを起動することができます。たとえば、次のようにします。

${JAVA_HOME}/bin/java com.sun.corba.se.internal.Activation.ServerTool 
-ORBInitialPort ${ORB_INITIAL_PORT} -cmd register -server 
sample.MyServer -classpath jar1:jar2:jar3 -applicationName sample

servertoolクラスの名前は、将来のリリースで変更になる可能性があることに注意してください。

Linuxプラットフォームでネーム・サービス(tnameservorbd)を実行できない場合には、どうしたらよいでしょうか。

Linux上でネーム・サービスの起動が失敗する場合は、/etc/hostsファイルに次の行を組み込みます。
<Local Host IP Address>   localhost
<Local Host IP Address>   <HostName>

ここで<Local Host IP Address>は、ネーム・サービス(tnameservorbd)を起動するホストのIPアドレスです。

機能

今回のリリースで、CORBAの実装はどのようなスレッド・モデルをサポートしていますか。

Java SEに同梱されているJava CORBA ORBはマルチスレッド化されています。サーバー側に用意されているスレッド・プールでは、各着信要求が独立したスレッドによって処理されます。プールのスレッドがすべて使用中のときに新しい要求を受け取ると、新しいスレッドが作成されてプールに追加されます。このスレッドは、要求が完了すると、プールに戻されます。Java CORBA ORBは、スケーラビリティと要求の同時処理を実現するために、スレッド化されています。POAスレッド・ポリシー用のSINGLE_THREADオプションはサポートされていません。Java CORBA ORBのスレッド・モデルは次のように暗黙的です。すなわち、ユーザーは、ORBのスレッド・ポリシーを設定しません。また、スレッド・モデルやスレッド数を制御するための、公開された外部のユーザー・レベルAPIはありません。

Java IDLには通知サービスやイベント・サービスがありますか。インタフェース・リポジトリはどうですか。

いいえ、ありません。これらのサービスが必要な場合は、自分で実装するか、既製品を購入するか、自由に利用できるサービスを探すことができます。そのようなサード・パーティのサービスは、INSテクノロジを使用してORBにプラグインできます。

2台のマシンでHello Worldの例を実行する方法を教えてください。

ネーム・サーバーと同一のマシン上で実行されていないクライアントやサーバーを起動する場合、-ORBInitialHost< ネーム・サービスが起動されるホストの名前>オプションを使います。こうすると、クライアントとサーバーはネーム・サービスの場所を知ることができます。例は、「Java IDL: Hello Worldの例を2つのマシン上で実行する」にあります。

Java IDLテクノロジはCORBA仕様に準拠していますか。

J2SE 5.0に同梱されているCORBAテクノロジの準拠に関する情報は、「J2SE 5.0でのCORBAサポートの公式仕様」にあるCORBAの準拠についての説明を参照してください。

互換性と相互運用性

J2SE 5.0のCORBA仕様への対応

J2SE 5.0でのCORBAサポートの公式仕様」を参照してください。

別のORBを指定するにはどうすればよいでしょうか。

アプリケーション内でJava CORBA ORB以外のORBを使用するには、org.omg.CORBA.ORBClassプロパティを、選択したORBに設定します。たとえば、使用したいORB実装をORBに設定するには、次の例のようなコードを使用します。
public class MyApp {

    public static void main( String args[] ) {
        Properties properties = System.getProperties();
        properties.put( "org.omg.CORBA.ORBClass",
            "<com.other_company.package.ORB>" );
        
        try {
             ORB orb = ORB.init( args, properties);
             
             ...

使用するORB実装に固有のプロパティ設定については、ベンダーのドキュメントを参照してください。

使用しているJDK ORBクライアントが、別のベンダーのORB実装と通信できるかどうかをテストする方法を教えてください。

このORBについては、J2EEの動作保証プロセスの一環としてテストを実施済みです。ただし、すべてのベンダーのスタンドアロンCORBA ORBとの相互運用性についてテストを実施したわけではありません。

使用する他ベンダーのサービスでINSがサポートされている場合は、それを試してみてください。INSを利用し、ORB.object_to_string()メソッドを使用して、他ベンダーのORBサーバー上のInteroperable Object References (「Java ID: Interoperable Naming Service (INS)の例」を参照)を文字列に変換します。その文字列をファイルに書き込みます。

CORBAクライアントとEJBサーバー・アプリケーションの使用例は提供されていますか。

C++クライアントとEnterprise JavaBeansコンポーネントを使用したサンプル・アプリケーションを含む開発者ガイドは、次のWebサイトに見つかります。Enterprise JavaBeans(tm)コンポーネントとCORBAクライアント: 開発者ガイド

SunのORBからサード・パーティ製のネーム・サービスに接続する方法を教えてください。

サード・パーティ製のネーム・サービスがInteroperable Naming Service (INS)をサポートしている場合は、「Java ID: Interoperable Naming Service (INS)の例」を使用する方法をお薦めします。

Sun ORBをほかのベンダーのネーム・サービスとともに使用するには

  1. ホスト<H>およびポート<P>上でサード・パーティ製のネーム・サーバーを起動します。
  2. 次の引数をORB.init()に渡します。
            -ORBInitRef NameService=corbaloc:iiop:1.2@:/NameService
       
    

orb.resolve_initial_references("NameService")を実行すると、サード・パーティ製のネーム・サービスに接続できるようになるはずです。接続できない場合は、次のトラブルシューティングに関するヒントを試してください。

C++のCORBAサーバーとともにJava IDL ORBが使えますか。(相互運用性がありますか)

Java IDL ORBは完全にJavaテクノロジを使用して記述されたORBです。idljコンパイラは、「IDL to Java言語マッピング仕様」で定義された規約に従うコードを生成します。Java ORBは、Javaプラットフォーム以外の言語でコードを生成するコンパイラを提供しません。Java ORBとそれ以外の言語(C++など)で記述したORBとの相互運用性をテストする場合、その言語で記述したORBとその言語マッピングに一致するコンパイラを探す必要があります。言語マッピング仕様は、Object Management GroupのWebサイト(http://www.omg.org/)から入手できます。一方でJavaプラットフォームを使用し、もう一方でC++を使用するには、IDLを共有するだけで十分です。C++ORBのツールを使ってC++ORBで使用するスタブとスケルトンを生成する必要がありますが、IDLは変更する必要がありません。CORBA ORBと、使用する言語の言語マッピング・コンパイラを提供するベンダーは、「C++CORBA ORB」などのキーワードでWebを検索します。

C++クライアントとEnterprise JavaBeansコンポーネントを使用したサンプル・アプリケーションを含む開発者ガイドは、次のWebサイトに見つかります。Enterprise JavaBeans(tm)コンポーネントとCORBAクライアント: 開発者ガイド

異なる言語で書かれたORB間での通信が可能なはずですが、Java ORBとほかのベンダーのORBとの相互運用性はまだテストされていません。

一般

Java IDLとJava RMI-IIOPテクノロジのどちらを使うべきか

これは基本的な問題であり、Javaプログラミング言語とCORBAを統合する2つの方式の違いを理解することが重要です。

Java IDLテクノロジは、CORBAインタフェース定義言語(Interface Definition Language、IDL)で定義されたインタフェースに基づいてJavaプログラミング言語でプログラムを記述したいCORBAプログラマ向けです。これは「通常どおりの」CORBAプログラミングで、C++やCOBOLのようなほかの言語とまったく同じ方法でJavaをサポートしています。

Java RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol)テクノロジは、IIOPを背後のトランスポートとして使用してJava Remote Method Invocation (Java RMI)インタフェースでプログラムを作成したい、Javaプログラマ向けです。RMI-IIOPはさまざまな言語で実装されるCORBAオブジェクトとの相互運用性を提供しますが、リモート・インタフェースをあらかじめJava RMIインタフェースとして定義しておく必要があります。EJBのリモート・オブジェクト・モデルはJava RMIテクノロジベースなので、Enterprise JavaBeans(tm)(EJB(tm))テクノロジを使うプログラマには特に重要です。

idltojavaコンパイラはどこでダウンロードできますか。

idltojavaコンパイラをダウンロードすることはできなくなりました。IDL-to-Javaコンパイラidljの最新バージョンを使用することを強くお薦めします。

最新バージョンのIDL-to-Javaコンパイラを入手するには、最新バージョンのJava(tm) Platform, Standard Edition (Java SE)をダウンロードしてください。Java SEをインストールすると、idljbinディレクトリに格納されます。

Javaテクノロジを使ってCORBAアプリケーションを開発する場合にどのようなオプションがありますか。

Java 2プラットフォームの一部であるCORBA技術は、Java言語で書かれたObject Request Broker (ORB) (一部はネイティブ・コードで書かれている)、RMIプログラミング・モデルおよびIDLプログラミング・モデルで構成されています。異なる言語間、異なるベンダー間の相互運用性はInternet InterORB Protocol (IIOP)という「魔法」を使用して実現されました。IIOPは、IDLかJava RMIのいずれかで書かれた分散アプリケーション用の伝送プロトコルです。IIOPを使えば、分散オブジェクトをOMGのCORBA仕様に適合させることができます。IDLプログラミング・モデルを使う場合は、インタフェースがすべてです。これは、リモート・プロセスから呼び出ことができるエントリ・ポイント(呼び出された手続きが受け入れる引数の型など)や、返された情報の値や出力パラメータなどを定義します。IDLを使用すると、プログラマは通信プロセス間を移動するエントリ・ポイントやデータ型を標準言語であるかのように扱うことができます。CORBAは言語から中立のシステムで、引数の値や戻り値は使用する実装言語で表すことができるものに制限されます。CORBAでは、オブジェクトの方向は参照用に渡すことができるオブジェクトに制限されるか、または全体のフレームワークであらかじめ定義されています。オブジェクト・コード自体をマシン間で渡すことができません。渡す型も戻す型もインタフェースで宣言されている必要があります。RMIでは、IDLと実装言語は同一のものであり、お互いをマッピングするための心配はありません。言語レベルのオブジェクト(コード)をあるプロセスから次のプロセスに渡すことができます。値は、宣言された型ではなく実際の型で返されます。または、インタフェースをコンパイルしてIIOP準拠のスタブとスケルトンを生成し、他のCORBA準拠言語で書かれている別のマシンのオブジェクトと通信できます。

Java IDLとJava RMI-IIOPはどのように違うのですか。

これは基本的な問題であり、Javaプログラミング言語とCORBAを統合する2つの方式の違いを理解することが重要です。Java IDLは、CORBAインタフェース定義言語(IDL)で定義されたインタフェースに基づいてJavaプログラミング言語でプログラムを記述したいCORBAプログラマ向けです。これは「通常どおりの」CORBAプログラミングで、C++やCOBOLのようなほかの言語とまったく同じ方法でJava言語をサポートしています。Java RMI-IIOP (Remote Method Invocation over Internet Inter-ORB Protocol)は、IIOPを背後のトランスポートとして使用し、Javaプログラミング言語を使用してJava RMIインタフェースをプログラミングしたい開発者向けです。Java RMI-IIOPはさまざまな言語で実装されるCORBAオブジェクトとの相互運用性を提供しますが、すべてのリモート・インタフェースをあらかじめJava RMIインタフェースとして定義しておく必要があります。EJBのリモート・オブジェクト・モデルはRMIベースなので、Enterprise JavaBeans (EJB)を使うプログラマには特に重要です。分散型CORBAアプリケーションの作成にはいくつかの定義方法があります。次に一般的な方法を示します。

Java IDLやJava RMI-IIOPを使用する際、何か制限事項はありますか。

製品の制限の詳細については、「制限」を参照してください。

各種の標準タグについて知りたいのですが。

最新バージョンの標準タグ割当てファイルについては、OMGのWebサイト(http: //www.omg.org/)を参照してください。

Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.