【问题标题】:Generating java from IDL (avoiding default package)从 IDL 生成 java(避免默认包)
【发布时间】:2012-06-27 04:35:50
【问题描述】:

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

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

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

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

我考虑过以下几点:

  1. 在所有类型周围放置一个模块声明。我目前正在使用这个解决方案,但基于受影响的类型数量以及对大型遗留 C++ 代码库的影响,它非常痛苦。
  2. 使用 -pkgPrefix 或 -pkgTranslate 选项。到目前为止,我不知道如何通用地完成此操作,因为您必须指定一个模块来翻译 from 或指定一个类型来添加前缀 to。 -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;
};

【问题讨论】:

  • 问:您使用什么工具从 IDL 生成 Java?标准的太阳“idlj”?你能否举一个具体的例子:1)你的命令行(带有“-pkgPrefix”)和2)生成的Java(不起作用)?

标签: java corba idl


【解决方案1】:

您可以使用选项 pkgPrefix 和 pkgTranslate 如a french site 所示 我想你说得对,但我会详细说明以防万一。

示例:

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 的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多