从IDL生成java(避免默认包)

时间:2012-06-25 21:19:44

标签: java corba idl

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

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

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

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

我考虑过以下几点:

  1. 围绕所有类型放置模块声明。我目前正在使用这个解决方案,但根据受影响的类型数量以及对大型遗留C ++代码库的影响,这非常痛苦。
  2. 使用-pkgPrefix或-pkgTranslate选项。到目前为止,我无法弄清楚如何一般地完成此操作,因为您必须指定一个模块来从转换或指定一个类型以将添加到。 -pkgPrefix可用于特定类型,但我们有数百种类型,而不是专门为每个编译文件列出-pkgPrefix选项......
  3. 使用pragma指令?我不知道有人可以使用,但希望大师可以指明方向吗?
  4. ????
  5. 如果没有包含所有类型的现有模块,我发现很难相信没有简单的方法强制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;
    };
    

1 个答案:

答案 0 :(得分:2)

您可以使用a french site中所示的选项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的组合。