我正在使用具有大量 IDL 文件的大型遗留 C++ 代码库,这些文件具有在任何模块之外声明的所有类型和常量。
对于 C++,这会导致代码生成到全局命名空间——丑陋,但可以接受。
现在我正在尝试添加 Java 客户端以通过 CORBA 进行连接。但是,对于 Java,从 IDL 生成的类型(使用 Sun/Oracle IDL 编译器为 java: idlj)在 java默认包中,因为它们不在 IDL 模块中。这会导致 Java 编译错误,因为从默认包导入是非法的。
我正在寻找解决问题的最简单方法。
我考虑了以下几点:
- 在所有类型周围放置一个模块声明。我目前正在使用这个解决方案,但它非常痛苦,基于受影响的类型数量以及对大型遗留 C++ 代码库的影响。
- 使用 -pkgPrefix 或 -pkgTranslate 选项。到目前为止,我无法弄清楚如何一般地完成此操作,因为您必须指定一个模块来翻译或指定一个类型来添加前缀到. -pkgPrefix 可用于特定类型,但我们有数百种类型,我不想专门为每个编译文件列出 -pkgPrefix 选项......
- 使用编译指示指令?我不知道要使用一个,但希望大师能指点一下?
- ???
如果没有包含所有类型的现有模块,我很难相信没有简单的方法可以强制 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;
};