使用Maven和Spring控制项目:如何使用Maven配置文件设置Spring配置文件?

我正在尝试根据某个Maven配置文件是否处于活动状态来配置包含数据库信息的Spring配置文件。 我已经看到了这些问题的答案,但我无法将它们放在一起。

我有一个像这样的Maven个人资料:

  production   environment.type prod     development   environment.type dev     oracle.jdbc.driver.OracleDriver oracle 192.168.0.0 1521 myDb jdbc:${db.type}:thin:@${db.host}:${db.port}:${db.name}  

还有一个这样的settings.xml文件:

   development jsmith secret   ....    true   dev    

在servlet-context.xml中:

   ${db.driver}   ${db.url}   ${db.username}   ${db.password}   10   1   

我的问题基本上是,我如何将maven属性放入servlet-context.xml文件中? 我需要.properties文件吗? 我对Spring中Maven和PropertyPlaceholderConfigurer的过滤有所了解,但我不知道如何将它们放在一起 – 或者它们是否一起使用? 或者有更简单的方法吗?

我需要.properties文件吗?

一般来说,YES,你需要使用.properties文件,这是我们通常所做的,特别是对于处理spring上下文文件中的数据库连接配置。

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

将这些数据库连接设置存储在pom.xml中不是一个好习惯,因为pom.xml的目的是用于项目描述,并且仅在应用程序构建时使用一次(例如mvn deploy)。 并且在大多数情况下,即使它被打包到最终的jar / war文件中,我们在构建应用程序之后并不真正关心并触摸它。

要在spring上下文中使用.properties文件,请在applicationContext中定义propertyConfigurer bean,例如:

     classpath:db.properties  file:///opt/my-web-app/conf/db.properties     

希望这是有道理的。

使用我从两个答案和我的研究中学到的东西,我能够得到一个由pom控制的开发/生产系统,它设置了正确的数据库值。

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

     production   environment.type prod      development   environment.type dev      src/main/resources/dev.database.properties     src/main/webapp/WEBINF/ true     

在servlet-context.xml中,在WEBINF目录中,我放置了占位符:

        10   1   

然后我创建了一个属性文件,放在src / main / resources中

 # # 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为我设置正确的配置文件:

     true   dev     

主要问题是:您如何通过RPM,jenkins构建手动将WAR文件部署到不同的环境?,您是否也希望将相同的WAR文件部署到所有环境?

a)您希望通过JENKINS作业(或通过maven手动)部署WAR,只需处理您的资源并在jar的构建过程中使用配置文件(mvn -P生产清洁部署),maven pom应该包含代码喜欢这个:

   ${config.maven.plattform.resources}/environment/${config.environment.dir}/your_proyect.properties    resources/servlet-context.xml true   target/generated-resources true   

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

b)您希望所有项目都具有相同的WAR / RPM等。 然后你必须将environemt定义为应用程序servert的java启动中的属性:-DENVIRONMENT = production,然后使用参数化的PropertyPlaceholderConfigurer加载所有属性,如yorkw所指出的:

    classpath:environment/${ENVIRONMENT}/your_project.properties    

还记得将所有属性放在WAR中,WAR构建的pom应包含如下代码:

   copy-env-resources  validate  copy-resources   ${basedir}/src/main/webapp/WEB-INF/classes/environment/ true   ${basedir}/${build_to_all_your_environments}  **/*.properties      

c)混合的:你可以手动选择一个环境而不是在服务器中定义为属性的环境(-D),你可以通过使用默认属性来获得这个,如果没有找到,那么求助于那个environemt,这一步很复杂,因为它需要另一组属性,如果你有兴趣检查我的post: 使用maven和spring部署不同的环境 ,我也对c)更好的解决方案感兴趣