我正在使用大型遗留C ++代码库,其中包含许多IDL文件,这些文件包含在任何模块之外声明的所有类型和常量。
对于C ++,这导致代码生成到全局命名空间 - 丑陋但可以接受。
现在我正在尝试添加Java客户端以通过CORBA进行连接。但是,对于Java,从IDL生成的类型(使用适用于Java的Sun / Oracle IDL编译器: idlj )位于java 默认包中,因为它们不是在IDL模块中。这会导致Java编译错误,因为从默认包导入是非法的。
我正在寻找解决问题的最简单方法。
我考虑过以下几点:
如果没有包含所有类型的现有模块,我发现很难相信没有简单的方法强制IDL在Java包中。我希望我只是错过了显而易见的事情!
修改:
示例:
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;
};
答案 0 :(得分:2)
您可以使用a french site中所示的选项pkgPrefix和pkgTranslate 我猜你有那个部分是正确的,但我会详细说明以防万一。
示例:
interface T1
{
};
interface T2
{
};
你在文件idl.config
中输出pkgPrefixPkgPrefix.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的组合。