如何通过OSGi blueprint property-placeholder和Java DSL加载外部属性文件

时间:2015-05-27 06:36:29

标签: java apache-karaf blueprint-osgi apache-servicemix

我在Apache servicemix中安装了一个捆绑包,它使用apache蓝图进行配置。我正在使用位于/ config文件夹中的外部属性文件 abc.cfg ,并按如下方式加载:

通过蓝图

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel-cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/blueprint/core"
xsi:schemaLocation="
    http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
    http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
    http://cxf.apache.org/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd
    http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">

<cm:property-placeholder id="myProperties" persistent-id="abc" />

通过java DSL

public class MyActivator implements BundleActivator {

    @Override
    public void start(final BundleContext context) throws Exception {
        final ServiceReference serviceReference = context.getServiceReference(ConfigurationAdmin.class.getName());
        if (serviceReference != null) {

            final ConfigurationAdmin admin = (ConfigurationAdmin) context.getService(serviceReference);
            final Configuration configuration = admin.getConfiguration("abc");
            final Dictionary<String, Object> configurations = configuration.getProperties();

            if (configurations == null) {
                throw new CustomException("Exception in loading properties file");
            }
            populateProperties(configurations);
        }
    }
}

一切正常但现在我需要在自定义位置移动属性文件以隔离不同包中的属性文件。所以我在/ config / myFolder /中移动了 abc.cfg ,但我无法以任何方式指定我的捆绑包的新位置。我尝试使用 ext:property-placeholder 但它没有用,可能是因为我使用它错了(找不到任何全面的理解它)。 因此,请指导我如何在cm:property-placeholder中指定我的属性文件的位置,以及通过java DSL中的配置管理服务指定位置。此外,我不确定是否可以在我的捆绑包中以两种不同的方式加载相同的属性文件。

1 个答案:

答案 0 :(得分:4)

蓝图cm:property-placeholde和配置管理服务都不使用您添加到etc文件夹的文件。 cm只是使用配置管理服务的另一种方式 felix FileInstaller会从ServiceMix实例的etc文件夹中读取cfg文件,并将这些属性传播到Configuration Admin服务。
因此,在您的情况下,您需要向FileInstaller添加另一个配置以从另一个路径读取 这可以通过添加新配置文件来完成:

org.apache.felix.fileinstall-mySpecialDir.cfg

添加要监视的新文件夹:

felix.fileinstall.dir = myNewSpecialDirectory-to-be-watched
如果需要,还可以加一些。 可以找到here

的文档