【问题标题】:Spring MVC - Is it possible for a jar file to refer to a properties file that is not in the jar file?Spring MVC - jar 文件是否可以引用不在 jar 文件中的属性文件?
【发布时间】:2013-01-16 20:34:41
【问题描述】:

我有一个 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 文件中的对象访问。

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

谢谢。

【问题讨论】:

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


    【解决方案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 中删除属性声明。

    【讨论】:

    • 我也尝试了这个选项,但在加载属性之前仍然解析了导入的资源。
    猜你喜欢
    • 2012-08-26
    • 2014-10-02
    • 2014-02-05
    • 2012-07-24
    • 2010-12-08
    • 2012-03-20
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多