簡體   English   中英

如何在OSGi包中使用屬性文件

[英]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. ontologymapping.properties是用戶特定的和小的
  2. ontologymapping.properties是用戶特定的和大的(即屬性是一個廉價的GUI代碼)
  3. ontologymapping.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM