Доступ к ресурсам в другом пакете 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")