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

时间:2013-08-05 12:35:34

标签: java file-io properties osgi

在我的应用程序的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中。 我怎样才能做到这一点?或者读取属性文件内容的另一种方法是什么? 该包不是声明性的,它是另一个声明性的api包。

3 个答案:

答案 0 :(得分:4)

我觉得你有几根电线交叉。 context.getProperty(..)类似于System.getProperty(...),实际上你在上下文中找到了大部分的System.getProperties()。因此,在您的情况下,您的代码似乎是这样做的,您可以使用VM -D命令行选项将文件名放在系统属性中:-Dontologymapping.properties =“myfile.properties”。这应该可以使你的代码工作。

然而......这类代码的问题是你现在有一个需要读取文件系统文件的包。有三种情况需要区分:

  1. ontologymapping.properties是特定于用户且小的
  2. ontologymapping.properties是用户特定的和大的(即属性是一个便宜的GUI代码)
  3. ontologymapping.properties只是程序员存储数据的便捷方式
  4. 在案例1中,您可能希望查看带有元类型的配置管理员。这允许您使用良好的配置GUI创建应用程序。使用bnd DS注释,您可以在Apache Felix Web控制台中使用非常少的代码和非常好的gui。

    在案例2中,您的上述代码有效。您可以考虑添加一个gogo shell并创建一个命令,以便人们可以阅读和更新它。

    在最后一种情况下,#3,您应该将属性存储在bundle中,并使用Myclass.class.getResourceAsStream(“/ ontology.properties”)读取它。在bnd(工具)中,只需Include-Resource: ontolology.properties,它就会出现在你的包中,随时可以阅读。

答案 1 :(得分:2)

您可以使用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();
}

答案 2 :(得分:2)

我修好了。 问题是ontologymapper.properties位于一个定义了抽象类的bundle中。 在该抽象类中,实现了扩展类的start方法,并在该start方法中调用了context.getBundle()。 这似乎返回了实现类的包而不是带有抽象类的包。 因此,通过将属性文件放在带有实现类的包中来解决问题。