2012-06-25 3 views
7

Я работаю с LARGE старой базой кода C++ с многочисленными IDL-файлами, которые имеют все типы и константы, объявленные вне любого модуля.Создание java из IDL (избегая пакета по умолчанию)

Для C++ это приводит к генерации кода в глобальное пространство имен - уродливое, но приемлемое.

Теперь я пытаюсь добавить клиентов Java для подключения через CORBA. Однако для Java типы, которые генерируются из IDL (с использованием компилятора Sun/Oracle IDL для java: idlj), находятся в пакете по умолчанию по умолчанию, потому что они не входят в модуль IDL. Это приводит к ошибкам компиляции Java, поскольку импортировать из пакета по умолчанию запрещено.

Я ищу самый простой способ исправить проблему.

Я рассмотрел следующее:

  1. Место декларации модуля вокруг всех типов. В настоящее время я работаю над этим решением, но это очень больно, основываясь на количестве затронутых типов и влиянии на большую базовую кодовую базу C++.
  2. Используйте параметры -pkgPrefix или -pkgTranslate. До сих пор я не могу понять, как это сделать в целом, поскольку вы должны указать модуль для перевода из или указать тип для добавления префикса по номеру. -pkgPrefix может использоваться для определенного типа, но у нас есть сотни типов, и я бы предпочел не перечислять опцию -pkgPrefix специально для каждого скомпилированного файла ...
  3. Используйте прагматическую директиву? Я не знаю, какой из них использовать, но надеясь, что гуру может указать путь?
  4. ????

Мне трудно поверить, что нет простого способа заставить IDL находиться в пакете Java, если нет существующего модуля, который содержит все типы. Я надеюсь, что я просто пропущу очевидное!

Edit:

  • IDL к 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; 
}; 
+2

Вопрос: Какой инструмент вы используете для генерации Java из IDL? Стандартное солнце «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.

Смежные вопросы