2013-08-05 5 views
3

В комплекте OSGi в моем приложении у меня есть файл свойств, содержащий имя ontologymapping.properties. Теперь я хочу прочитать содержимое этого файла свойства. В некотором примере кода я нашел что-то вроде этого в методе запуска пучка:Как использовать файл свойств в пакете OSGi

public void startObservationAdapter(BundleContext context) { 
    String filename = context.getProperty("ontologymapping.properties"); 
    try { 
     File file = new File(filename); 
     InputStream in = new FileInputStream(file); 
     ontologymapping.load(in); 
     in.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

где ontologymapping является экземпляром свойства. Когда я запускаю этот код, JVM не может найти файл. Я думаю, причина в том, что файл не включен в BundleContext. Как я могу это сделать? Или какой еще способ прочитать содержимое файла свойств? Пакет не является декларативным, это набор апи для другого, который является декларативным.

+2

context.getProperty не делает то, что вы думаете. Также: В каком пакете находится файл «ontologymapping.properties», а у пакета есть этот код? Сказали, почему нет http://www.osgi.org/javadoc/r4v42/org/osgi/service/cm/ConfigurationAdmin.html? –

ответ

2

Я установил его. Проблема заключалась в том, что онтологические свойства были расположены в связке, где был определен абстрактный класс. В этом абстрактном классе был реализован метод начала расширяющих классов и в этом методе запуска я назвал context.getBundle(). Кажется, это возвращает пучок реализующих классов, а не пучок с абстрактным классом. Таким образом, проблема была устранена путем размещения файла свойств в пакетах с реализующими классами.

2

Вы можете получить URL-адрес вашего файла свойств с помощью bundle.getResource ('mypropfile.properties'), где bundle - это тот, который содержит файл свойств. На основе URL-адреса вы можете получить inputStream файла (resourceURL.openStream). Вы можете передать входной поток функции properties.load.

Если вы не хотите использовать специальный код OSGi, или вы не можете получить объект bundle пакета, который содержит файл свойств, который вы можете играть с загрузчиками классов. Представьте, что MyClass находится в том же пакете, что и файл свойств. В этом случае также работает следующий фрагмент кода:

Properties myProps = new Properties(); 
InputStream is = null; 
try { 
    is = MyClass.class.getResourceAsStream("ontologymapping.properties"); 
    myProps.load(is); 
} finally { 
    is.close(); 
} 
+0

Спасибо, я предпочитаю использовать OSGi. Когда я запускаю его сейчас, он все равно не находит файл свойств. Я все еще получаю исключение NullPointerException. Файл свойств находится в самом пакете, где этот код написан. Должен ли я регистрировать файл как ресурс где-то, возможно? – PieterDB

+1

Нет. Вы можете получить доступ к любому файлу в комплекте с пакетом bundle.getResource. В вашем коде, если вы вызываете context.getBundle(), getResource («ontologymapping.properties») должен вернуть URL-адрес, указывающий на ваш файл свойств, и вы должны иметь возможность открыть InputStream с этим URL-адресом. Если файл есть, и вы уверены, что контекст указывает на ваш пакет, попробуйте запустить путь ресурса с помощью косой черты, например «/ontologymapping.properties». У вас также могут быть проблемы, если пакет находится только в установленном состоянии, но я не думаю, что это ваш случай. –

+0

Метод call: context.getBundle(). GetResource ("ontologymapping.properties") 'возвращает' null', и файл находится в каталоге, я пытался использовать «/», но это не сработало нигде, как я могу проверьте, возвращает ли 'context.getBundle()' мой пакет? – PieterDB

4

Я думаю, что у вас есть несколько проводов, пересеченных. context.getProperty (..) похож на System.getProperty (...), и на самом деле вы обнаруживаете большую часть System.getProperties() в контексте. Итак, в вашем случае, и ваш код, похоже, сделает это, вы можете поместить имя файла в свойства системы с помощью опции командной строки VM -D: -Dontologymapping.properties = "myfile.properties". Это должно заставить ваш код работать.

Однако ... проблема с этим типом кода заключается в том, что теперь у вас есть пакет, который должен прочитать файл в файловой системе. Есть три случая отличающие:

  1. ontologymapping.properties специфично пользователь и небольшой
  2. ontologymapping.properties специфичен пользователь и большой (т.е. свойства являются дешевым GUI для вас кода)
  3. ontologymapping.properties это просто удобный способ для программиста сохранить свои данные.

В случае 1 вы можете посмотреть конфигурационный администратор с метатетом. Это позволяет создавать приложения с удобным графическим интерфейсом конфигурации. Используя аннотации bnd DS, вы можете уйти с ужасно маленьким кодом и действительно приятным gui в Apache Felix Webconsole.

В случае 2, приведенный выше код. вы можете подумать о добавлении оболочки gogo и создать команду, чтобы люди могли ее прочитать и обновить.

В последнем случае # 3 вы должны сохранить свойства внутри пакета и прочитать его с помощью Myclass.class.getResourceAsStream ("/ ontology.properties"). В bnd (tools), только Include-Resource: ontolology.properties и он будет присутствовать в вашем комплекте, готовый к чтению.

+0

Третий случай - это именно то, что мне нужно. Однако я не понимаю, что вы имеете в виду с bnd (tools)? Вы имеете в виду, что я должен положить 'Include-Resource: ontologymapping.properties' в мой MANIFEST.MF? – PieterDB

+0

bnd (tools): bnd - это библиотека для создания манифестов из файла «bnd». Он используется в плагине пакета Apache Felix Maven и в Eclipse IDE, называемом bndtools: http://bndtools.org/ Это, безусловно, лучший способ сделать пакеты. Если вы не хотите использовать bnd, вы должны убедиться, что файл ontologymapping.properties находится в ваших ресурсах. Либо через maven, либо через команду jar. –

Смежные вопросы