虽然配置文件肯定是解决该问题的方法,但我认为这种方法为您仅在目标平台上发现的问题打开了另一扇大门。
在我的项目中,我总是将属性外部化,并将尽可能多的属性转换为运行时参数。
试想一下,必须再次捆绑 Jenkins/Sonar/etc,因为您的平台不会成为具有位于类路径中的属性的配置文件的一部分。我不认为这些会是成功的项目;)
至于 spring,您可以在 propertyconfigurer 中使用 'file://' 协议,允许替换来自类路径的“dedault”属性。因此,您有两个带有订单参数和其他属性的配置器标签。这是一个例子:
<jee:jndi-lookup id="configDirectory" jndi-name="configDirectory"
resource-ref="true" default-value="." />
<jee:jndi-lookup id="datasource" jndi-name="jdbc/datasource"
expected-type="javax.sql.DataSource" default-ref="localDatasource" />
<!-- Allows fetching properties from multiple locations: -->
<!-- external definition -> file://${configDirectory}/root-context.properties
-> declared in context.xml -->
<!-- standard web application bundle -> /WEB-INF/spring/root-context.properties -->
<!-- testing -> classpath:root-context.properties -->
<context:property-placeholder location="${configDirectory:.}/context.properties"
order="9" ignore-resource-not-found="true" ignore-unresolvable="true" />
<context:property-placeholder
location="/WEB-INF/spring/context.properties,
classpath:context.properties"
order="10" ignore-resource-not-found="true" ignore-unresolvable="true" />
<context:property-placeholder location="classpath:spring/default.properties"
order="100" />
像这样,我们能够在本地构建它,在 maven 构建期间运行我们的单元和集成测试,在 UAT 上运行构建,如果一切正常,将构建从 UAT 复制到 PROD,而无需修改 war 文件。
在属性中我们定义了所有在运行时不能更改的参数,本质上是 Hibernate 参数加上其他一些参数。
其余的都作为简单的系统参数(键值对)存储在数据库中。有很多属性不需要修复。这包括:LDAP、MailSender、像 tempdir 等文件夹定义。
由于数据源是最先启动的 bean 之一,这在我目前正在运行的项目中工作得非常好,而且我们仍在发现更多要推送到数据库中的属性。