2016-04-15 98 views
6

我們具有運行JBOSS AS7 4臺服務器:環境JBOSS AS7特定屬性

  • 開發
  • 測試
  • ACC
  • 督促

在每個JBoss的,一個簡單的Web應用程序會跑。這個web應用程序將使用彈簧,並需要設置一些屬性,如:

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

回答

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更容易混淆屬性文件中的數據。所以如果安全受到威脅,這是一個需要考慮的問題。

0

在我的公司,我們用來在數據庫中存儲依賴於環境的屬性。這意味着你有一個每個環境的數據庫。但不確定你的應用程序有數據庫來存儲這些數據。

另一種解決方案是使用一個系統屬性,你要麼定義不同的每臺服務器上,或者在執行時變的,當你啓動服務器:

  • 定義你的standalone.xml,用default如果沒有my.cmd-line-descriptor指定

    <system-properties> 
        <property name="my-specific-value" value="${my.cmd-line-descriptor:default}"/> 
        ... 
    </system-properties> 
    
  • 改變它,如果需要在應用程序服務器啓動時,將用於:

    java ... -Dmy.cmd-line-descriptor=another-value 
    

您帶來額外的問題,我建議你看從控制檯在appservers

0

tmp/vfs目錄所做的更改如果您使用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訪問這些屬性。

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的管理控制檯,最底部有「系統屬性」中進行設置以及在「配置」選項卡 - 它實際上是在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目錄的子目錄帶 - 開發,測試等使用相同的文件名每一個。

在我目前的組織中,NFS是不允許的。羣集中的每個從屬實例都擁有自己的文件克隆,它們的位置完全相同,即config/myapp.properties。所以,只有一個系統屬性被定義爲該文件的路徑。每個環境都有自己的文件版本。

祝你好運!