控制与Maven和春天有个项目:如何设置使用Maven型材Spring配置文件?(Controlli

2019-06-26 21:14发布

我想配置基于一定的Maven的配置文件是否是活动的数据库信息的Spring配置文件。 我见过的答案件这一点,但我无法把他们放在一起。

我有一个Maven的轮廓是这样的:

<profiles>
    <profile>
        <id>production</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>prod</value>
            </property>
        </activation>
    </profile>

    <profile>
        <id>development</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>dev</value>
            </property>
        </activation>

        <!-- Database properties for Spring -->
        <properties>
            <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>
            <db.type>oracle</db.type>
            <db.host>192.168.0.0</db.host>
            <db.port>1521</db.port>
            <db.name>myDb</db.name>
            <db.url>jdbc:${db.type}:thin:@${db.host}:${db.port}:${db.name}</db.url>
        </properties>

和settings.xml文件是这样的:

<servers>
  <server>
    <id>development</id>
    <username>jsmith</username>
    <password>secret</password>
  </server>
</servers>

....

<profiles>
  <profile>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>

    <properties>
      <environment.type>dev</environment.type>
    </properties>
  </profile>
</profiles>

而在servlet的context.xml中:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
    <property name="driverClassName">
        <value>${db.driver}</value>
    </property>

    <property name="url">
        <value>${db.url}</value>
    </property>

    <property name="username">
        <value>${db.username}</value>
    </property>

    <property name="password">
        <value>${db.password}</value>
    </property>

    <property name="maxActive">
        <value>10</value>
    </property>

    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>

我的问题基本上是,如何获取Maven的特性到servlet-context.xml文件? 我需要一个属性文件? 我了解一些春季的Maven和PropertyPlaceholderConfigurer以及过滤,但是我不知道如何把它们放在一起 - 还是他们一起去? 还是有更简单的方法?

Answer 1:

我需要一个属性文件?

一般来说,YES,你需要使用属性文件,这就是我们通常做的,尤其是对于在Spring上下文文件处理数据库连接配置。

.properties文件的目的是提供在应用程序运行时配置数据库连接的能力(对于Web应用程序,通常需要重新启动后属性文件修改应用程序容器/服务器)。 这通常是在部署应用程序/在不同的环境(开发/测试/ UAT / PROD)的安装步骤中完成。

这不是存储在pom.xml中的数据库连接设置一个很好的做法,为的pom.xml的目的是为项目描述,只有在应用程序生成时间(例如MVN部署)使用一次。 而对于大多数的时间,即使它被包装成最终的jar / war文件,我们并不真正关心和触摸它的应用程序后建成。

要使用属性文件春季背景下,在你的applicationContext定义propertyConfigurer豆,例如:

<bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <!-- Default location inside war file -->
      <value>classpath:db.properties</value>
      <!-- Environment specific location, a fixed path on server -->
      <value>file:///opt/my-web-app/conf/db.properties</value>
    </list>
  </property>
  <property name="ignoreResourceNotFound" value="true"/>
</bean>

希望这是有意义的。



Answer 2:

使用我从两个答案和我的研究了解到,我能得到一个开发/生产体系,由聚甲醛控制,即设置正确的数据库值。

首先,在POM,我创建了两个配置文件。

<!-- Production and Development Profiles -->

<profiles>
    <!-- Nike profile needs go here -->
    <profile>
        <id>production</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>prod</value>
            </property>
        </activation>
    </profile>

    <!-- Catalyst profile needs go here -->
    <profile>
        <id>development</id>
        <activation>
            <property>
                <name>environment.type</name>
                <value>dev</value>
            </property>
        </activation>

        <build>

            <!-- This holds the properties for the Spring context file.
                 Database values will be changes to development. -->
            <filters>
                <filter>src/main/resources/dev.database.properties</filter>
            </filters>

            <resources>

                <!-- This is the directory that holds the Spring context
                     file.  The entire folder is searched, so either no
                     other file should have place holders or you should
                     exclude other files from being filtered. -->
                <resource>
                    <directory>src/main/webapp/WEBINF/</directory>
                    <filtering>true</filtering>
                </resource>
            </resources>
    </profile>
</profiles>

在servlet-context.xml中,在WEB-INF目录下,我把占位符:

<!-- For database, uses maven filtering to fill in placeholders -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url"             value="${db.url}" />
    <property name="username"        value="${db.username}" />
    <property name="password"        value="${db.password}" />
    <property name="maxActive">
        <value>10</value>
    </property>
    <property name="maxIdle">
        <value>1</value>
    </property>
</bean>

然后,我创建了一个属性文件中的src / main /资源坐

#
# Development database properties file
#
db.driver=oracle.jdbc.driver.OracleDriver
db.url=jdbc:oracle:thin:[USER/PASSWORD]@[HOST][:PORT]:SID
db.username=jsmith
db.password=s3cr3t

然后我可以开始使用Maven的

mvn -P developement clean install

或有settings.xml中,设置正确的配置文件对我来说:

<settings>
  <profiles>
    <profile>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>

      <properties>
        <environment.type>dev</environment.type>
      </properties>
    </profile>
  </profiles>   
</settings>


Answer 3:

主要的问题是:你打算怎么来部署WAR文件,以不同的environemnts?通过RPM,一个詹金斯打造,手工?还你想同一个WAR文件DE部署到所有的环境?

a)您想部署你的战争六一JENKINS工作(或手动基于Maven),只是处理您的资源,并在罐子(MVN -P生产清洁部署)的构建过程中使用的配置文件,Maven的POM应包括代码像这样:

    <filters>
        <filter>${config.maven.plattform.resources}/environment/${config.environment.dir}/your_proyect.properties</filter>
    </filters>
    <resources>
        <resource>
            <directory>resources/servlet-context.xml</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>target/generated-resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>

你应该定义在文件your_proyect.properties你的属性(每环境),并定义为config.environment.dir所有不同的配置文件。

b)您想的一样WAR / RPM等,为您的所有项目。 然后,你必须定义environemt在应用程序SERVERT的Java启动的属性:-DENVIRONMENT =生产,然后作为yorkw指出了一个参数化PropertyPlaceholderConfigurer加载所有的属性:

<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
        <value>classpath:environment/${ENVIRONMENT}/your_project.properties</value>
        </list>
    </property>
</bean>

还记得把所有的性能在战争中的POM WAR构建应包括这样的代码:

                <execution>
                    <id>copy-env-resources</id>
                    <!-- here the phase you need -->
                    <phase>validate</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes/environment/</outputDirectory>
                        <overwrite>true</overwrite>
                        <resources>
                            <resource>
                                <directory>${basedir}/${build_to_all_your_environments}</directory>
                                <includes>
                                    <include>**/*.properties</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>

C)混合一个:你可以手动选择过定义为服务器(-D)的属性之一的环境,你可以使用默认属性得到这个,如果没有找到,然后再打一个用于environemt,这一步因为它需要另一组属性,如果你有兴趣检查我的岗位是相当令人费解: 部署针对不同环境使用Maven和春天 ,我也有兴趣在针对c更好的解决方案)



文章来源: Controlling a project with Maven and Spring: How to set Spring config file using Maven profiles?