【问题标题】:Importing Spring properties files from jar file on classpath从类路径上的 jar 文件导入 Spring 属性文件
【发布时间】:2014-06-11 08:42:36
【问题描述】:

我想导入所有属性文件,以 .properties 结尾,这些文件包含在我的项目所有 ALL jar 依赖项的 src/main/resource 位置。

我编写了一个 JUnit 测试,其中我的 context.xml 位于 src/test/resources 文件夹中。我使用通配符指定了属性占位符,但它不起作用。

<context:property-placeholder location="classpath*:*.properties"/>

可能是我太笨了,但我在网上找不到解决问题的方法。这里有人知道正确的语法是什么吗?

编辑:

根项目具有 maven 依赖项,从我的工作区解析:

我想导入依赖项目的module.properties文件:

【问题讨论】:

  • 我严重怀疑你能否在春天做到这一点。位置的 xsd 明确指出“要解析占位符的属性文件的位置,作为 Spring 资源位置:URL、“类路径:”伪 URL 或相对文件路径。可以指定多个位置,用逗号分隔. 如果既没有指定 location 也没有指定 properties-ref,占位符将根据系统属性进行解析”
  • 你试过这个
  • @DevPa 这不会增加对文件系统位置的依赖吗?是否可以将其表示为相对路径?
  • 他们在src/main/resources而不是src\main\resources\some-dir?这个 jar 在您的测试类路径中也可用吗?你是如何将它添加到你的类路径中的?
  • 您应该将其添加为 Maven 依赖项,目前您正在混合 Maven 和 Eclipse 本地依赖项(据我所知,这是等待发生的麻烦)。如果项目在您的本地工作区中,则 eclipse maven 集成应该能够获取它。如果您已经对该项目有一个 maven 依赖项,该依赖项可能会覆盖本地工作区中的内容,这意味着没有 modules.properties,因为这似乎是一个新文件。

标签: java spring


【解决方案1】:

来自春天documentation

“classpath*:”前缀还可以与位置路径的其余部分中的 PathMatcher 模式组合,例如“classpath*:META-INF/*-beans.xml”。 [...]

但是有一个限制:

请注意,当与 Ant 样式模式结合使用时,“classpath*:”只能在模式开始前至少在一个根目录下可靠地工作,除非实际的目标文件驻留在文件系统中。这意味着像“classpath*:*.xml”这样的模式不会从 jar 文件的根目录中检索文件,而只会从扩展目录的根目录中检索文件。 [...]

因此,如果我将模块的属性文件放在 src/main/resources/META-INF 中,我可以按如下方式加载它们:

<context:property-placeholder location="classpath*:/META-INF/*.properties" />

【讨论】:

    【解决方案2】:

    你也可以这样做:

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                <property name="locations">
                    <list>
                        <value>classpath*:your.properties</value>
                        <value>classpath*:your.properties</value>
                         .....
                    </list>
                </property>
                <property name="ignoreUnresolvablePlaceholders" value="true"/>
            </bean>
    

    更复杂的例子:

    <bean id="propertyPlaceholderConfigurer"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreResourceNotFound" value="true" />
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="locations">
            <list>
                <value>classpath*:properties/defaults.properties</value>
                <value>classpath*:properties/${props.env.name}.properties</value>
    
                <value>classpath*:com/calciuum/config/defaults.properties</value>
                <value>classpath*:com/calciuum/config/${props.env.name}.properties</value>
    
                <value>classpath*:${props.env.classpath}/defaults.properties</value>
                <value>classpath*:${props.env.classpath}/${props.env.name}.properties</value>
    
                <value>file:${props.env.ext.properties}</value>
            </list>
        </property>
    </bean>
    

    【讨论】:

      【解决方案3】:

      如果你使用的属性小于 4。你可以使用这个:

      <context:property-placeholder location="classpath:test1.properties,classpath:test2.properties" />
      

      别用这个

      <context:property-placeholder location="classpath:*.properties" />
      

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 2018-10-12
        • 2019-03-04
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多