2012-06-25 68 views
7

我正在使用一個大型的遺留C++代碼庫,其中包含許多IDL文件,這些文件的所有類型和常量都在任何模塊之外聲明。從IDL生成java(避免默認包)

對於C++來說,這會導致代碼被生成到全局名稱空間 - 很難看,但可以接受。

現在我試圖添加Java客戶端通過CORBA進行連接。但是,對於Java,由IDL生成的類型(使用Java的Sun/Oracle IDL編譯器:idlj)位於java 默認包中,因爲它們不在IDL模塊內。這會導致Java編譯錯誤,因爲從默認包導入是非法的。

我正在尋找解決問題的最簡單方法。

我已經考慮了以下幾點:

  1. 周圍放置各類一個模塊聲明。我目前正在使用這個解決方案,但基於受影響的類型數量以及對大型傳統C++代碼庫的影響,這非常痛苦。
  2. 使用-pkgPrefix或-pkgTranslate選項。到目前爲止,我不知道如何實現這一般,因爲您必須指定一個模塊來翻譯或指定一個類型來添加前綴。 -pkgPrefix可用於特定類型,但我們有上百種類型,我寧願不爲每個編譯文件列出-pkgPrefix選項...
  3. 使用編譯指示?我不知道要使用哪一個,但希望上師能指點道路?
  4. ?????

我發現很難相信,如果沒有包含所有類型的現有模塊,就沒有簡單的方法來迫使IDL在Java包中。我希望我只是錯過了明顯的!

編輯

  • IDL-to-Java編譯爲IDLJ
  • 添加了下面的示例。
  • 更新項目#2(以上),以澄清使用-pkgPrefix每種類型是不可行

實施例(除非它可以合理腳本):


Foo.idl

struct 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; 
}; 
+2

問:您使用什麼工具從IDL生成Java?標準的Sun「idlj」?你能舉一個具體的例子:1)你的命令行(帶「-pkgPrefix」)和2)由此產生的Java(這不工作)? – paulsm4

回答

2

你可以選擇pkgPrefix和pkgTranslate發揮所示在a french site 我想你有那部分權利,但我詳細以防萬一。

例如:

interface T1 
{ 
}; 
interface T2 
{ 
}; 

你出去pkgPrefix配置文件idl.config

PkgPrefix.T1=aaa 
PkgPrefix.T2=bbb 

下面的命令

idlj -td dir T.idl 

在(現有的)目錄目錄創建的文件:

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