将 Spring + Maven 的 jdbc.properties 配置文件外移

/ Java / 没有评论 / 2604浏览

注意

有些地方是一行的,该行末尾被我用 \ 换行并忽略换行所有空格、换行符。

项目结构

alt

Spring 原配置

通常 Spring 配置文件 applicationContext.xml 是如下配置:(缩写代码)

<beans>
    <!-- 设置属性配置文件 -->
    <context:property-placeholder 
        location="classpath:jdbc.properties"/>

    <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${mysql.jdbc.driverClassName}"/>
        <property name="url" value="${mysql.jdbc.url}"/>
        <property name="username" value="${mysql.jdbc.username}"/>
        <property name="password" value="${mysql.jdbc.password}"/>
    </bean>
</beans>

jdbc.properties 文件配置如下:

mysql.jdbc.driverClassName=com.mysql.jdbc.Driver
mysql.jdbc.url=jdbc:mysql://127.0.0.1:3306/cjsd?useUnicode=true& \
        characterEncoding=utf-8&characterSetResults=utf-8& \
        zeroDateTimeBehavior=convertToNull \
mysql.jdbc.username=root
mysql.jdbc.password=admin

在这时,我们用 Maven 的 Package打包发现,会将 jdbc.properties 打包到 jar 包中.

Spring优化配置

我们将

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

改成:

<!-- 定义受环境影响易变的变量 -->
<bean class="org.springframework.beans. \
    factory.config.PropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" 
        value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
    <property name="ignoreResourceNotFound" value="true"/>
    <property name="locations">
        <list>
            <!-- 标准配置 -->
            <value>classpath:jdbc.properties</value>
            <value>file:./conf/jdbc.properties</value>
        </list>
    </property>
</bean>

其中,配置了两个资源文件,classpath是用于调试时指定资源文件,file 是发布后的资源文件目录,在执行jar的conf目录.

这时Spring会报一个资源文件不能找到的错误,但是Spring资源文件只会加载一次,所以对性能稍有影响问题不大。

Maven 资源文件排除

我们在 pom.xml 中的 build 节点增加如下代码:

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <excludes>
            <exclude>**/jdbc.properties</exclude>
            <exclude>jdbc.properties</exclude>
        </excludes>
    </resource>
</resources>

其中第一段配置声明:在src/main/resources目录下,仅jdbc.properties文件不是资源文件。

在这时,我们发布后发现 jar 包里面的资源文件 jdbc.properties 已经不存在。

Maven 资源文件复制

然后我们可以在 plugins 中增加插件,将配置文件 jdbc.properties 复制到 conf 目录下.

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.5</version>
    <executions>
        <execution>
            <id>copy-xmls</id>
            <phase>process-sources</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}/target/conf</outputDirectory>
                <resources>
                    <resource>
                        <directory>${basedir}/src/main/resources</directory>
                        <includes>
                            <include>**/jdbc.properties</include>
                        </includes>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

这时,我们的文件更改成功,需要注意 Maven 的 Clean .不然可能会存在错误.