JBOSS AS7中的环境特定属性

时间:2016-04-15 14:00:41

标签: java spring deployment properties jboss

我们有4台运行JBOSS AS7的服务器:

  • dev的
  • 测试
  • ACC

在每个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.xmlhost.xml中看到它们。

4 个答案:

答案 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)拥有自己的文件克隆。因此,只有一个系统属性被定义为该文件的路径。每个环境都有自己的文件版本。

祝你好运!