7

我正在使用具有大量 IDL 文件的大型遗留 C++ 代码库,这些文件具有在任何模块之外声明的所有类型和常量。

对于 C++,这会导致代码生成到全局命名空间——丑陋,但可以接受。

现在我正在尝试添加 Java 客户端以通过 CORBA 进行连接。但是,对于 Java,从 IDL 生成的类型(使用 Sun/Oracle IDL 编译器为 java: idlj)在 java默认包中,因为它们不在 IDL 模块中。这会导致 Java 编译错误,因为从默认包导入是非法的。

我正在寻找解决问题的最简单方法。

我考虑了以下几点:

  1. 在所有类型周围放置一个模块声明。我目前正在使用这个解决方案,但它非常痛苦,基于受影响的类型数量以及对大型遗留 C++ 代码库的影响。
  2. 使用 -pkgPrefix 或 -pkgTranslate 选项。到目前为止,我无法弄清楚如何一般地完成此操作,因为您必须指定一个模块来翻译指定一个类型来添加前缀. -pkgPrefix 可用于特定类型,但我们有数百种类型,我不想专门为每个编译文件列出 -pkgPrefix 选项......
  3. 使用编译指示指令?我不知道要使用一个,但希望大师能指点一下?
  4. ???

如果没有包含所有类型的现有模块,我很难相信没有简单的方法可以强制 IDL 位于 Java 包中。我希望我只是错过了显而易见的事情!

编辑

  • IDL-to-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 回答