在我的应用程序的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包。
答案 0 :(得分:4)
我觉得你有几根电线交叉。 context.getProperty(..)类似于System.getProperty(...),实际上你在上下文中找到了大部分的System.getProperties()。因此,在您的情况下,您的代码似乎是这样做的,您可以使用VM -D命令行选项将文件名放在系统属性中:-Dontologymapping.properties =“myfile.properties”。这应该可以使你的代码工作。
然而......这类代码的问题是你现在有一个需要读取文件系统文件的包。有三种情况需要区分:
在案例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()。 这似乎返回了实现类的包而不是带有抽象类的包。 因此,通过将属性文件放在带有实现类的包中来解决问题。