私は、モジュールの外部で宣言されたすべての型と定数を持つ多数の IDL ファイルを含む、大規模なレガシー C++ コード ベースを使用しています。
C++ の場合、これによりコードがグローバル名前空間に生成されます。見苦しいですが、許容範囲です。
現在、CORBA 経由で接続する Java クライアントを追加しようとしています。ただし、Java の場合、IDL から生成された型 (java 用の Sun/Oracle IDL コンパイラ: idljを使用) は、IDL モジュール内にないため、Javaデフォルト パッケージに含まれます。デフォルトのパッケージからのインポートは違法であるため、Java コンパイル エラーが発生します。
問題を修正する最も簡単な方法を探しています。
私は次のことを検討しました:
- すべての型をモジュール宣言で囲みます。私は現在、このソリューションに取り組んでいますが、影響を受ける型の数と、大規模なレガシー C++ コードベースへの影響に基づいて、非常に苦痛です。
- -pkgPrefix または -pkgTranslate オプションを使用します。これまでのところ、変換元のモジュールを指定するか、接頭辞を追加するタイプを指定する必要があるため、これを一般的に達成する方法がわかりません。-pkgPrefix は特定のタイプに使用できますが、何百ものタイプがあり、コンパイルされたファイルごとに -pkgPrefix オプションを具体的にリストしたくありません...
- プラグマ ディレクティブを使用しますか? 使用するものはわかりませんが、教祖が道を示してくれることを望みますか?
- ????
すべてのタイプを含む既存のモジュールがない場合、IDL を強制的に Java パッケージに含める簡単な方法がないとは信じがたいです。明らかなことを見逃していることを願っています!
編集:
- IDL から Java へのコンパイラはidljです。
- 以下に例を追加しました。
- 項目 #2 (上記) を更新して、各タイプに -pkgPrefix を使用することは実行できないことを明確にしました (適切にスクリプト化できない場合は?)。
例:
Foo.idl
struct Foo
{
.
.
.
}
Foo.java: (パッケージが指定されていないことに注意してください。つまり、デフォルトのパッケージです):
public final class Foo implements org.omg.CORBA.portable.IDLEntity
{
.
.
.
}
ClassUsesFoo.java:
package com.sigh;
import Foo; // <-- this is an error
public class ClassUsesFoo
{
private Foo f;
};