【发布时间】:2012-06-27 04:35:50
【问题描述】:
我正在使用包含大量 IDL 文件的大型遗留 C++ 代码库,这些文件具有在任何模块之外声明的所有类型和常量。
对于 C++,这会导致生成到全局命名空间的代码——丑陋,但可以接受。
现在我正在尝试添加 Java 客户端以通过 CORBA 进行连接。但是,对于 Java,从 IDL 生成的类型(使用 Sun/Oracle IDL 编译器为 java:idlj)在 java 默认包中,因为它们不是在 IDL 模块中。这会导致 Java 编译错误,因为从默认包导入是非法的。
我正在寻找解决问题的最简单方法。
我考虑过以下几点:
- 在所有类型周围放置一个模块声明。我目前正在使用这个解决方案,但基于受影响的类型数量以及对大型遗留 C++ 代码库的影响,它非常痛苦。
- 使用 -pkgPrefix 或 -pkgTranslate 选项。到目前为止,我不知道如何通用地完成此操作,因为您必须指定一个模块来翻译 from 或指定一个类型来添加前缀 to。 -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;
};
【问题讨论】:
-
问:您使用什么工具从 IDL 生成 Java?标准的太阳“idlj”?你能否举一个具体的例子:1)你的命令行(带有“-pkgPrefix”)和2)生成的Java(不起作用)?