我们有 4 台运行 JBOSS AS7 的服务器:
- 开发
- 测试
- 记
- 产品
在每个 jboss 上,一个简单的 webapp 将运行。这个 webapp 将使用 spring 并需要设置一些属性,例如:
webservice.endpoint=interface.url.com
webservice.port=7676
每个环境的属性都不同。目前我们的处理方式如下:
我有一个 JAR 文件,里面只有一个文件,config.properties。此属性文件包含我的所有属性。我将这个 jar 变成一个全局 jboss 模块,并在我的 domain.xml
(或 standalone.xml
)中配置它以包含在内。这是可行的,因为 spring 可以在制作 bean 时访问这些属性。
但是,将属性转换为 jar、模块似乎过于复杂。我在想我应该使用系统属性来实现这个目标吗?我的问题是:这是放置所有特定于环境、特定于应用程序的属性的好地方吗?它们是否会加载到 JVM 中以便每个人都可以随意访问它们(尤其是 Spring,它使用 ${myProperty}
表示法来访问属性)。此外,当我在浏览器中使用控制台添加属性时,它们是否已存储?我在 domain.xml
或 host.xml
中看不到它们。
最佳答案
如果您使用 JAR 解决方案: - 为每个环境使用一个独特的分类器。您将拥有 x 个属性文件:dev_config.properties/test_config.properties 等...
这样你就可以设置一个唯一的 JAVA_OPTS 来设置你所在的环境。 然后你得到正确的属性文件:
使用:System.getenv("ENV")
或 System.getProperty("ENV")
if ("DEV".Equals(System.getenv("ENV"))
here you load ==> the dev_config.properties
要将属性加载到 JAR 中,使用这个 Maven 插件非常容易。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<id>packaging-deployment_manifests_bundle</id>
<phase>package</phase>
<goals>
<goal>attached</goal>
</goals>
<configuration>
<descriptors>
<descriptor>descriptors/deployment_manifests_bundle.xml</descriptor>
</descriptors>
</configuration>
</execution>
</executions>
</plugin>
如果您使用 environment_variables : 我从来没有在我的项目中尝试过这个解决方案,我总是使用属性文件解决方案。但是如果你只有几个变量要设置,这可能会更快......你可以访问这些变量:
import java.util.Map;
public class EnvMap {
public static void main (String[] args) {
Map<String, String> env = System.getenv();
for (String envName : env.keySet()) {
System.out.format("%s=%s%n",
envName,
env.get(envName));
}
}
}
在环境变量中添加数据是可以的,如果它不是敏感的,比如密码之类的。 IMO 更容易混淆属性文件中的数据。因此,如果安全受到威胁,这是一个需要考虑的问题。
关于java - JBOSS AS7 中的环境特定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36649258/