Доступ к ресурсам в другом комплекте OSGI? - PullRequest
13 голосов
/ 19 августа 2010

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

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

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

Теперь в комплекте BI попробуйте загрузить файл .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;
  }

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

Ответы [ 5 ]

16 голосов
/ 22 августа 2010

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

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

3 голосов
/ 22 августа 2010

Если вы пишете плагин 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 голосов
/ 19 августа 2010

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

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

1 голос
/ 22 августа 2010

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

0 голосов
/ 06 октября 2012

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

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