Я создал два пакета OSGI A и B, используя мастер проекта подключаемого модуля eclipse (используя eclipse Helios).
В файл манифеста комплекта BI добавили комплект A в качестве зависимости. Далее я экспортировал пакеты в A, чтобы они были видны для B. У меня также есть файл .properties в комплекте A, который я хотел бы сделать видимым для пакета B. В сборке. Панель свойств в пакете 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;
}
Но это дает исключение нулевого указателя (файл не найден в пути к классам).
Возможно ли это экспортировать ресурсы из пакета A (как при экспорте пакетов) или каким-либо другим способом получить доступ к файлу в A из B (доступ к загрузчику классов для пакета A из пакета B)?
Если вы пишете подключаемый модуль 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();
Не рассматривали ли вы возможность добавления метода в API пакета A, который загружает и возвращает ресурс?
Многие могут счесть это лучшим дизайном, поскольку это позволяет изменять имя или способ хранения ресурса, не ломая клиентов пакета A.
. Для этого предназначен метод getEntry (String)
в Bundle
. Вы можете использовать его для загрузки любого ресурса из любого пакета. Также посмотрите методы findEntries ()
и getEntryPaths ()
, если вы не знаете точный путь к ресурсу внутри пакета.
Для этого не нужно использовать загрузчик классов пакета.
Вы пытались использовать BundleContext пакета A для загрузки ресурсов?