我正在使用一個大型的遺留C++代碼庫,其中包含許多IDL文件,這些文件的所有類型和常量都在任何模塊之外聲明。從IDL生成java(避免默認包)
對於C++來說,這會導致代碼被生成到全局名稱空間 - 很難看,但可以接受。
現在我試圖添加Java客戶端通過CORBA進行連接。但是,對於Java,由IDL生成的類型(使用Java的Sun/Oracle IDL編譯器:idlj)位於java 默認包中,因爲它們不在IDL模塊內。這會導致Java編譯錯誤,因爲從默認包導入是非法的。
我正在尋找解決問題的最簡單方法。
我已經考慮了以下幾點:
- 周圍放置各類一個模塊聲明。我目前正在使用這個解決方案,但基於受影響的類型數量以及對大型傳統C++代碼庫的影響,這非常痛苦。
- 使用-pkgPrefix或-pkgTranslate選項。到目前爲止,我不知道如何實現這一般,因爲您必須指定一個模塊來翻譯從或指定一個類型來添加前綴到。 -pkgPrefix可用於特定類型,但我們有上百種類型,我寧願不爲每個編譯文件列出-pkgPrefix選項...
- 使用編譯指示?我不知道要使用哪一個,但希望上師能指點道路?
- ?????
我發現很難相信,如果沒有包含所有類型的現有模塊,就沒有簡單的方法來迫使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;
};
問:您使用什麼工具從IDL生成Java?標準的Sun「idlj」?你能舉一個具體的例子:1)你的命令行(帶「-pkgPrefix」)和2)由此產生的Java(這不工作)? – paulsm4