3

在我的应用程序的 OSGi 包中,我有一个包含名为ontologymapping.properties. 现在我想读取这个属性文件的内容。在一些示例代码中,我在包的 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();
    }
}

ontologymappingProperties 实例在哪里。当我运行此代码时,JVM 找不到该文件。我猜原因是该文件未包含在 BundleContext 中。我怎样才能做到这一点?或者读取属性文件内容的另一种方法是什么?该包不是声明性的,它是另一个声明性的 api 包。

4

3 回答 3

4

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

但是......这种类型的代码的问题是您现在有一个需要读取文件系统上的文件的包。区分以下三种情况:

  1. ontologymapping.properties 是用户特定的并且很小
  2. ontologymapping.properties 是用户特定的并且很大(即属性是您代码的廉价 GUI)
  3. ontologymapping.properties 只是程序员存储其数据的一种便捷方式

在案例 1 中,您可能希望查看带有 Metatype 的配置管理。这允许您创建具有良好配置 GUI 的应用程序。使用 bnd DS 注释,您可以在 Apache Felix Webconsole 中使用非常少的代码和非常好的 gui。

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

在最后一种情况 #3 中,您应该将属性存储在包中并使用 Myclass.class.getResourceAsStream("/ontology.properties") 读取它。在 bnd(tools) 中,Include-Resource: ontolology.properties它会出现在你的包中,随时可供阅读。

于 2013-08-05T14:52:06.040 回答
2

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

于 2013-08-05T18:52:23.613 回答
2

您可以使用 bundle.getResource('mypropfile.properties') 获取属性文件的 URL,其中 bundle 是包含属性文件的文件。根据 URL,您可以获得文件的 inputStream (resourceURL.openStream)。您可以将输入流传递给 properties.load 函数。

如果您不想使用特定于 OSGi 的代码,或者您无法获取包含您可以使用类加载器的属性文件的包的包对象。想象一下 MyClass 与属性文件在同一个包中。在这种情况下,以下代码片段也可以工作:

Properties myProps = new Properties();
InputStream is = null;
try {
  is = MyClass.class.getResourceAsStream("ontologymapping.properties");
  myProps.load(is);
} finally {
  is.close();
}
于 2013-08-05T13:54:05.957 回答