Java 使用Spring和Webapp属性占位符查找属性

Java 使用Spring和Webapp属性占位符查找属性,java,spring,web-applications,properties,war,Java,Spring,Web Applications,Properties,War,这是一个“简单”的问题,我正在寻找一个如何做和/或一个你是哑巴,不要这样做。我对两者都持开放态度 我正在构建一个war文件,并希望结构为: WEB-INF/ properties/ <my properties files> classes/ ... spring/ <my spring files> WEB-INF/ 性质/ 班级/ ... 弹簧/ 那是不是很蠢?我知道我可以通过属性占位符访问属性文件,但我不希望将属性嵌套在类部分

这是一个“简单”的问题,我正在寻找一个如何做和/或一个你是哑巴,不要这样做。我对两者都持开放态度

我正在构建一个war文件,并希望结构为:

WEB-INF/
  properties/
    <my properties files>
  classes/
    ...
  spring/
    <my spring files>
WEB-INF/
性质/
班级/
...
弹簧/
那是不是很蠢?我知道我可以通过属性占位符访问属性文件,但我不希望将属性嵌套在类部分,这对我来说没有意义

因此,Spring文件如下所示:

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

如果我想在类区域中访问它们。我以为

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

让我直接把目录放在WEB-INF下……我错了吗(ps我想我错了:)


有什么建议吗?

我不知道你想达到什么目的。下面是我用来将基本属性文件中的属性注入bean的方法:

在spring文件(XMLBean定义)中,我添加了对属性文件(myfile.properties)的引用:


默认情况下,如果属性文件中未定义该属性,Spring将使用系统属性(此行为可以更改)。

您不能按照自己的方式执行,因为类加载器的类路径将是/classes目录和/lib目录中的任何JAR。这是war文件的标准配置

WAR和EAR具有特定的配置,您必须遵循这些配置才能使文件有效。仔细想想,如果没有标准格式,那么很难让不同的供应商提供可以部署相同war文件的web容器。有一个问题

为了实现与您想要的类似的功能,您可以简单地拥有/classes/properties和/classes/spring目录,并从类路径(“classpath:properties/myfile.properties”)中适当地查找它们。

这应该可以做到

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

WEB-INF不是WEB应用程序的根目录,因此需要将WEB-INF添加到路径中



我可以访问属性-这是我想要文件的位置。而不是WEB-INF/classes/properties/*。属性我更喜欢WEB-INF/properties/*。属性我认为spring文件的首选位置是WEB-INF/spring/。我记不起我在哪里读到的-但你在WEB.xml文件中设置了它。我不知道在您构建之前,您认为目录是“spring”,但一旦生成WAR,所有目录都会以“类”结束,从而在类路径上结束。这可能不是您的愿望,但WAR结构已经标准化;您不应该尝试自定义它。我将不使用属性文件:)。顺便说一句,spring文件不是copie看看petshop。它是由Maven构建的,它直接复制WEB-INF,然后将src/main/resources复制到WEB-INF/classes/中,属性通常位于src/main/resources中
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <!-- results in a setDriverClassName(String) call -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url"><value>${db.url}</value></property>
    <property name="username"><value>${db.login}</value></property>
    <property name="password"><value>${db.password}</value></property>

</bean>
<context:property-placeholder location="WEB-INF/properties/*.properties" />
<xsd:attribute name="location" type="xsd:string">
<xsd:annotation>
<xsd:documentation>
<![CDATA[ 
    The location of the properties file to resolve placeholders against, as a Spring
    resource location: a URL, a "classpath:" pseudo URL, or a relative file path.
    Multiple locations may be specified, separated by commas. If neither location nor properties-ref is
    specified, placeholders will be resolved against system properties.


  ]]> 
</xsd:documentation>
</xsd:annotation>
</xsd:attribute>