在大多数Java项目(Maven的,春季),我的工作,我有以下要求:
- 封装的罐子需要在多个环境中运行如开发,测试,督促
- 罐子不得重建为每个环境
- 每个环境都需要不同的配置属性
- 在发展中,我需要能够容易地在不同的环境之间,从而,在部署之前切换,以确保每个环境配置是否正确
到目前为止,我已经把所有配置属性为单独的属性文件,每一个环境来实现这一点。 然后我在从classpath这些文件的弹簧载荷。 然后,我只是改变在运行时类路径中需要的属性来加载。
这种做法一直运作良好,当我使用Eclipse,因为它易于安装多个运行配置,改变为每一个类路径。 一旦做到这一点,开关环境是选择相关运行配置的问题。
不幸的是,这是更难的IntelliJ中完成,因为运行时依赖只能添加到模块的配置( 如本答案记录 )。 如果我尝试设置类路径中运行配置本身那么这将覆盖所有模块的依赖,防止在所有正在运行的应用程序( 如记录在这里 )。 因此,切换的环境,我必须重新编辑该模块的依赖每次。
有没有用的IntelliJ实现这一目标的一个更简单的方法?
如果不是,是因为我的配置要求,还是我给他们的解决方案,是不寻常? 在这种情况下,有没有更好的办法?
以前的方法
我已经尝试过,并拒绝了一些方法:
Maven的概况 - 这些都需要重建我的罐子,每当我想改用环境。 除了烦人和危险的,这似乎是运行时配置完全不适合的(但理想的构建时的配置)。 这似乎是冒险得到一个破碎的建设投入生产,你不反对,实际上被部署在同一个罐子测试的好方法。 呸!
春天概况 - 这些看起来更合适,但似乎需要所有配置与罐子和文件名如dev.properties,prod.properties尊贵的部署。 然后,您可以在运行时传递变量选择你要哪一个。 这是好多了,但我不希望我的prod.properties找到自己的方式进入版本控制,也没有得到部署罐子本身。 因此,它似乎仍然需要修改类路径中,包括他们,我不能轻易的IntelliJ做
当我类似的问题跑,我开始与一个辅助类加载我的财产。 助手类将查找包含环境或者从加载属性的绝对/类路径相对路径的系统性能。
这样一来,代码始终是相同的,我没有更改项目的配置。 我只是用那些设置不同的属性不同的启动CONFIGS。
这里的主要缺点的课程,测试/开发CONFIGS漏入刺。 与Maven,简单的解决方案是将这些成一个新的模块,并设置的范围为它provided
。 这样一来,该模块将Maven的内部可见,但它不会WAR包装等过程中被列入
我做类似于@AaronDigulla做一些事情,但我覆盖的属性。 这是我第一次加载(使用Spring)的类路径的属性文件的所有属性。 然后我搜索特定的变量名和值(按以下顺序):
- 在servlet初始化参数
- 然后在系统属性
- 最后则环境变量
这个变量名和值包含的属性文件,将覆盖/覆盖从classpath加载属性的路径。 还加载将执行相同类型的分辨率的每个属性(也就是系统属性,环境变量和servlet初始化参数覆盖从属性文件中的属性)。
现在所有的开发商都推到使用默认的配置,在类路径中(即使用自己的数据库中的相同用户名/密码)。 那些有不同的设置可以使用上述3点不同的方式来覆盖。
您可以使用相同的引导配置代码 ,我用这将加载在所有的属性文件classpath*:META-INF/spring/*.properties
第一,然后它会加载在财产/环境设置文件/类路径URL的所有属性文件/初始化称为参数变量MyConfigParameter
(如果设置)。
然后属性文件被加载后终于将拉动财产/环境/初始化参数设置叫春节型材MyConfig.profiles
(逗号分隔)。
所以在生产中可能会设置环境变量MyConfigParameter=file://etc/myapp/*.properties
。
然后,这些属性文件的一个您可以设置MyConfig.profiles=production,postgres
将设置春节型材production
和postgres
。
Maven的配置文件释放您的构建机器上/建筑能明显调整MyConfigParameter
使用系统属性中的环境。 但是你必须告诉万无一失的单元测试具体有关该属性(尤其是如果分叉):
<!-- Surefire setup -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.9</version>
<configuration>
<printSummary>false</printSummary>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
<systemPropertyVariables>
<MyConfigParameter>${MyConfigParameter}</MyConfigParameter>
</systemPropertyVariables>
</configuration>
</plugin>
<!-- Profile to change MyConfigParameter -->
<profiles>
<profile>
<id>release</id>
<activation>
<property>
<name>env</name>
<value>release</value>
</property>
</activation>
<properties>
<MyConfigParameter>file://etc/MyApp/*.properties</MyConfigParameter>
</properties>
</profile>
</profiles>
文章来源: How can I easily switch between environment specific runtime configuration with IntelliJ?