Генерация java из IDL (избегая пакета по умолчанию)

Я работаю с БОЛЬШОЙ устаревшей кодовой базой C++ с многочисленными IDL-файлами, в которых все типы и константы объявлены вне какого-либо модуля.

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

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

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

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

  1. Поместите объявление модуля вокруг всех типов. В настоящее время я работаю над этим решением, но оно ОЧЕНЬ болезненно, в зависимости от количества затронутых типов и влияния на большую устаревшую кодовую базу C++.
  2. Используйте опции -pkgPrefix или -pkgTranslate. Пока что я не могу понять, как это сделать в общем, так как вы должны указать модуль для перевода из или указать тип для добавления префикса в . -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;
};
7
задан Kerry 25 June 2012 в 22:15
поделиться