1

我有一个 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中,我导入了applicationContext.xmljar 文件中的文件,如下所示:

<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位于 .jar 文件中的对象可以访问的属性文件WEB-INF/lib/externalApp.jar

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

谢谢。

4

1 回答 1

1

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

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

编辑

由于您conf/application.properties在您的网络应用程序中,因此您必须在您的网络应用程序应用程序上下文中定义它(而不是像现在这样在 jar 中)。并在导入 jar 的 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 中删除属性的声明。

于 2013-01-16T20:46:04.613 回答