7

私は、モジュールの外部で宣言されたすべての型と定数を持つ多数の IDL ファイルを含む、大規模なレガシー C++ コード ベースを使用しています。

C++ の場合、これによりコードがグローバル名前空間に生成されます。見苦しいですが、許容範囲です。

現在、CORBA 経由で接続する Java クライアントを追加しようとしています。ただし、Java の場合、IDL から生成された型 (java 用の Sun/Oracle IDL コンパイラ: idljを使用) は、IDL モジュール内にないため、Javaデフォルト パッケージに含まれます。デフォルトのパッケージからのインポートは違法であるため、Java コンパイル エラーが発生します。

問題を修正する最も簡単な方法を探しています。

私は次のことを検討しました:

  1. すべての型をモジュール宣言で囲みます。私は現在、このソリューションに取り組んでいますが、影響を受ける型の数と、大規模なレガシー C++ コードベースへの影響に基づいて、非常に苦痛です。
  2. -pkgPrefix または -pkgTranslate オプションを使用しますこれまでのところ、変換元のモジュールを指定するか、接頭辞追加するタイプを指定する必要があるため、これを一般的に達成する方法がわかりません。-pkgPrefix は特定のタイプに使用できますが、何百ものタイプがあり、コンパイルされたファイルごとに -pkgPrefix オプションを具体的にリストしたくありません...
  3. プラグマ ディレクティブを使用しますか? 使用するものはわかりませんが、教祖が道を示してくれることを望みますか?
  4. ????

すべてのタイプを含む既存のモジュールがない場合、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;
};
4

1 に答える 1

2

フランス語のサイトに示されているように、オプションpkgPrefixとpkgTranslateで遊ぶことができます 。その部分は正しいと思いますが、念のため詳しく説明します。

例:

interface T1
{
};
interface T2
{
};

ファイルidl.configでpkgPrefix構成を削除します

PkgPrefix.T1=aaa
PkgPrefix.T2=bbb

次のコマンド

idlj -td dir T.idl

(既存の)ディレクトリdirにファイルを作成します。

dir/
├── aaa
│   ├── T1Helper.java
│   ├── T1Holder.java
│   ├── T1.java
│   ├── T1Operations.java
│   └── _T1Stub.java
└── bbb
    ├── T2Helper.java
    ├── T2Holder.java
    ├── T2.java
    ├── T2Operations.java
    └── _T2Stub.java

構成ファイルを作成するには、grep / awk / sed/cutを組み合わせて使用​​できます。

于 2012-09-14T20:03:25.193 に答える