我们有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
中看到它们。
答案 0 :(得分:1)
如果您使用 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更容易混淆属性文件中的数据。因此,如果安全受到威胁,这是需要考虑的一点。
答案 1 :(得分:0)
在我的公司,我们习惯于在数据库中存储依赖于环境的属性。这意味着您拥有每个环境的数据库。但是,不确定您的应用程序是否有用于存储这些内容的数据库。
另一种解决方案是使用系统属性,您可以在每台服务器上以不同方式定义,也可以在启动服务器时在执行时更改:
在standalone.xml中定义,如果未指定default
,将使用my.cmd-line-descriptor
<system-properties>
<property name="my-specific-value" value="${my.cmd-line-descriptor:default}"/>
...
</system-properties>
在appserver启动时根据需要进行更改:
java ... -Dmy.cmd-line-descriptor=another-value
对于您的其他问题,我建议您在应用服务器的tmp/vfs
目录中查找从控制台进行的更改
答案 2 :(得分:0)
如果您在项目中使用Maven,您可以在不同的配置文件中按环境设置这些属性:
<profiles>
<profile>
<id>dev</id>
<properties>
<webservice.endpoint>interface.url.com</webservice.endpoint>
<webservice.port>7676</webservice.port>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<webservice.endpoint>test url</webservice.endpoint>
<webservice.port>whatever port</webservice.port>
</properties>
</profile>
</profiles>
然后,在编译项目时,您必须在-P参数中指定要为其编译的环境,以使用该配置文件的属性:
maven clean install -P dev
然后您可以使用Spring访问这些属性。
答案 3 :(得分:0)
我无法在domain.xml或host.xml中看到它们
它们位于<server>
的顶层,对于独立或<domain>
对于域
<server xmlns="urn:jboss:domain:1.7">
...
<system-properties>
<property name="myapp.env" value="dev"/>
</system-properties>
...
</server>
然后Spring可以将其视为${myapp.env}
或任何其他代码作为系统属性。
可以从JBoss管理控制台以及&#34;配置&#34;中设置它们。最底部的标签有&#34;系统属性&#34; - 它实际上是domain.xml中<system-properties>
标记的内容
它们也可以在domain.xml中使用。 例如,如果您根据环境将myapp.properties文件放在不同的目录中,则可以将其作为:
<server xmlns="urn:jboss:domain:1.7">
...
<system-properties>
<property name="myapp.env" value="dev"/>
<property name="myapp.config.file" value="${myapp.env}/myapp.properties"/>
</system-properties>
...
因此文件路径为dev/myapp.properties
,Spring会将其视为$ {myapp.config.file},然后可以从那里加载属性。
PS。另外我记得特定的系统属性可以在模块定义中设置,甚至可以在应用程序部署描述符jboss-deployment-structure.xml
中设置 - 不确定最后一个...顺便说一下,你的问题不是关于按环境区分的问题。
PPS。关于.properties如何在文件系统中存储 - 将它们保存在JAR文件中是一个坏主意。每当某些属性发生变化时,它都需要重建和部署。
.properties文件可以避免这种情况。所以他们必须在部署之外。
所以这取决于组织网络政策。
有一段时间,它是具有不同文件名的NFS目录,如dev_myapp.properties,test_myapp.properties等。
其他时候它是一个带有子目录的NFS目录 - dev,test等,每个目录都有相同的文件名。
在我目前的组织中,不允许使用NFS。群集中的每个Slave实例都在其完全相同的位置(即config/myapp.properties
)拥有自己的文件克隆。因此,只有一个系统属性被定义为该文件的路径。每个环境都有自己的文件版本。