使用maven配置文件时出错

时间:2014-08-24 16:10:06

标签: java spring maven pom.xml

我已经为我的应用添加了两个配置文件以及它的外观:

<profiles>
        <profile>
            <id>dev</id>
            <properties>
                <db.username>root</db.username>
                <db.password>root</db.password>
                <db.connectionURL>localhost:3306</db.connectionURL>
                <db.driverClass>com.mysql.jdbc.Driver</db.driverClass>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <db.username>prodroot</db.username>
                <db.password>prodpass</db.password>
                <db.connectionURL>localhost:3306</db.connectionURL>
                <db.driverClass>com.mysql.jdbc.Driver</db.driverClass>
            </properties>
        </profile>
    </profiles>

在我的jdbc.properties文件中,我改变了这样的值:

jdbc.driverClassName=${db.driverClass}
jdbc.dialect=org.hibernate.dialect.MySQLDialect
jdbc.databaseurl=jdbc:mysql://${db.connectionURL}/dbname
jdbc.username=${db.username}
jdbc.password=${db.password}

来自spring-container.xml

的豆子
<bean id="dataSource"
        class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"
        p:driverClassName="${jdbc.driverClassName}"
        p:url="${jdbc.databaseurl}" p:username="${jdbc.username}"
        p:password="${jdbc.password}" />

当我尝试部署我的应用程序时出现以下错误:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/spring-servlet.xml]: Could not resolve placeholder 'db.driverClass'

项目结构:

enter image description here

任何想法我做错了什么? 提前谢谢!

编辑:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.0</version>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>src/main/webapp/WEB-INF/</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

2 个答案:

答案 0 :(得分:1)

现在你已经设置了它的方式,资源被过滤了,但最终在classpath-root中,在本例中是WEB-INF / classes。

您想要maven-war-plugin do filtering on web-resources

答案 1 :(得分:0)

该错误似乎表明该值未在属性文件中被替换,因为它抱怨db.driverClass无法解析而不是jdbc.driverClassName。查看属性文件在构建的artefact中的外观。看起来您没有在Maven中启用资源过滤,或者您忘记激活任何配置文件。 要启用resource filtering,请将此类内容添加到<build>

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>

这假设您过滤的资源(例如您的jdbc.properties)位于通常的src/main/resources中,如果目前不是这种情况。我建议你先将所有过滤的资源移到那里,除非你有充分的理由反对它,因为它是迄今为止最简单的设置。确保不要尝试过滤二进制资源(如图像)!了解资源过滤(例如,将占位符转换为实际值)在构建时发生 ,因此您应该能够在生成的WAR中看到替换的值。

看起来像你的Spring中的占位符解析已经配置好了读取属性文件,但为了以防万一,你应该有这样的东西:

<context:property-placeholder location="classpath:/jdbc.properties" ignore-resource-not-found="true"/>

同样,这假设您的jdbc.properties位于类路径根目录中,如果将其放在src/main/resources中,则会满足,因为它将被复制到WEB-INF/classes。 您也可以使用其他路径(没有classpath:前缀),但我发现这是最简单的。了解Spring中的占位符分辨率在运行时发生 ,因此在尝试访问有线值之前,您不会收到错误。