Spring MVC - jar文件是否可以引用不在jar文件中的属性文件?

时间:2013-01-16 20:34:42

标签: java spring java-ee spring-mvc properties

我有一个spring MVC Web应用程序,它具有以下结构:

myapp
    |-META-INF
    |-WEB-INF
        |-classes
        |   |-conf
                |-application.properties
        |-lib
        |   |-externalApp.jar
        |       |-conf
        |           |-applicationContext.xml
        |
        |-applicationContext.xml
        |-myapp-servlet.xml

myapp/WEB-INF/applicationContext中,我导入了jar文件中的applicationContext.xml文件,如下所示:

<import resource="classpath:WEB-INF/conf/applicationContext.xml" /> 

导入资源中的bean工作正常,我可以在我的Web应用程序的控制器/服务类中看到它们。

我遇到的问题是 jar文件中的上下文文件(即WEB-INF/lib/externalApp.jar/applicationContext.xml)具有用于加载属性文件的配置。必须由Web应用程序设置属性,以便属性文件位于webapp中。 jar文件的上下文文件中的配置如下所示:

                 

我希望上面的属性加载Web应用程序中的属性文件,所以我将其值设置为如下所示:

<bean class="com.myapp.ExternalAppPropertyPlaceholderConfigurer">
        <property name="location" value="classpath:conf/application.properties" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

使用上面的设置,jar文件中期望这些属性可用的类仍然无法访问属性。

我猜的问题是如何让WEB-INF/classes/conf/application.properties中的属性文件可以被位于WEB-INF/lib/externalApp.jar的jar文件中的对象访问。

查看我得到的堆栈跟踪,看起来导入的上下文文件中引用的对象在加载属性之前首先加载,这不是我想要的。

感谢。

1 个答案:

答案 0 :(得分:1)

您可以像这样使用classpath*:前缀

<bean class="com.myapp.ExternalAppPropertyPlaceholderConfigurer">
    <property name="location" value="classpath*:conf/application.properties" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

修改

由于您的conf/application.properties位于您的网络应用程序中,您必须在您的网络应用程序applicationContext中定义它(不像现在那样在jar中)。并在导入jar的applicationContext之前定义它。即在你的web-app applicationContext中输入这样的东西:

<bean class="com.myapp.ExternalAppPropertyPlaceholderConfigurer">
    <property name="location" value="classpath:conf/application.properties" />
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
<import resource="classpath*:/conf/applicationContext.xml" />

并从jar applicationContext中删除属性声明。