[英]How to use a property file in an OSGi bundle
在我的應用程序的OSGi包中,我有一個名為ontologymapping.properties
的屬性文件。 現在我想閱讀這個屬性文件的內容。 在一些示例代碼中,我在bundle的start方法中發現了類似的東西:
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
是一個Properties實例。 當我運行此代碼時,JVM無法找到該文件。 我想原因是該文件未包含在BundleContext中。 我怎樣才能做到這一點? 或者讀取屬性文件內容的另一種方法是什么? bundle不是聲明性的,它是另一個聲明性的api包。
我想你有幾根電線交叉。 context.getProperty(..)類似於System.getProperty(...),實際上你在上下文中找到了大部分的System.getProperties()。 因此,在您的情況下,您的代碼似乎是這樣做的,您可以使用VM -D命令行選項將文件名放在系統屬性中:-Dontologymapping.properties =“myfile.properties”。 這應該使你的代碼工作。
但是......這類代碼的問題是你現在有一個需要讀取文件系統文件的包。 有三種情況需要區分:
在案例1中,您可能希望查看帶有元類型的配置管理。 這允許您使用良好的配置GUI創建應用程序。 使用bnd DS注釋,你可以在Apache Felix Webconsole中使用非常少的代碼和非常好的gui。
在案例2中,您的上述代碼有效。 您可以考慮添加一個gogo shell並創建一個命令,以便人們可以閱讀和更新它。
在最后一種情況#3中,您應該將屬性存儲在bundle中並使用Myclass.class.getResourceAsStream(“/ ontology.properties”)讀取它。 在bnd(工具)中,只有Include-Resource: ontolology.properties
,它將出現在你的包中,隨時可以閱讀。
您可以使用bundle.getResource('mypropfile.properties')獲取屬性文件的URL,其中bundle是包含屬性文件的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();
}
我修好了它。 問題是ontologymapper.properties位於一個定義了抽象類的bundle中。 在該抽象類中,實現了擴展類的start方法,並在該start方法中調用了context.getBundle()。 這似乎返回了實現類的包而不是帶有抽象類的包。 因此,通過將屬性文件放在帶有實現類的bundle中來解決問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.