Доступ к ресурсам в другом пакете osgi?

Я создал два пакета OSGI A и B, используя мастер проекта подключаемого модуля eclipse (используя eclipse Helios).

В файле манифеста пучка B я добавил связку A как зависимость. Далее я экспортировал пакеты в A, чтобы они были видны для B. У меня также есть файл .properties в пакете A, который я хотел бы сделать видимым для пакета B. В панели build.properties в пакете AI указано:

source.. = src/
bin.includes = META-INF/,\
               .,\
               bundle_A.properties

Теперь в комплекте B я пытаюсь загрузить файл .properties, используя:

  private Properties loadProperties() {
    Properties properties = new Properties();
    InputStream istream = this.getClass().getClassLoader().getResourceAsStream(
        "bundle_A.properties");
    try {
      properties.load(istream);
    } catch (IOException e) {
      logger.error("Properties file not found!", e);
    }
    return properties;
  }

Но это дает исключение nullpointer (файл не найден в пути к классам).

Можно ли экспортировать ресурсы из пакета A (как при экспорте пакетов) или каким-то образом получить доступ к файлу в из B по-другому (доступ к загрузчику классов для пакета A из пакета B)?

Ответы

Ответ 1

Если вы пишете плагин Eclipse, вы можете попробовать что-то вроде:

Bundle bundle = Platform.getBundle("your.plugin.id");

Path path = new Path("path/to/a/file.type");

URL fileURL = Platform.find(bundle, path);

InputStream in = fileURL.openStream();

Ответ 2

Метод getEntry(String) для Bundle предназначен для этой цели. Вы можете использовать его для загрузки любого ресурса из любого пакета. Также см. Методы findEntries() и getEntryPaths(), если вы не знаете точный путь к ресурсу внутри пакета.

Для этого не нужно захватывать загрузчик классов bundle.

Ответ 3

Рассматривали ли вы возможность добавления метода для связывания API, который загружает и возвращает ресурс?

Многие могут подумать, что это лучший дизайн, поскольку он позволяет изменять имя или средства хранения ресурса, не разбивая клиентов пакета A.

Ответ 4

Вы пытались использовать BundleContext для пакета A для загрузки ресурсов?

Ответ 5

Попробуйте с /; если вы не поместите /, загрузчик классов попытается загрузить ресурс из того же пакета.

this.getClass().getClassLoader().getResourceAsStream( "/bundle_A.properties")