2012-05-27 47 views
2

我有一個Java EE 6應用程序,使用Maven構建,NetBeans 7中的代碼和GlassFish 3.1.2上的部署。在我接近完成時,我發現自己正在部署演示版本。配置Java EE 6 for dev/QA/prod

問題是我沒有任何簡單的方法去構建不同的環境,比如dev,QA,demo,prod等。對於一些東西,我一直在使用一個Java類,靜態獲取器,它根據環境常量的值返回值。但是,這並不能幫助我,有條件設置

  • javax.faces.PROJECT_STAGE(web.xml中)
  • 數據庫憑據(GlassFish的-resources.xml中)
  • 郵件服務器(GlassFish的-resources.xml中)
  • JPA日誌記錄級別(persistence.xml中)

,可能其他的一些事情,我不敢去想,現在都分散在XML文件中。

是否有任何方法來定義這些配置文件的多個版本,只需在構建時設置一個標誌來選擇環境,而在沒有指定環境時默認爲dev?在這種情況下,我可以讓Maven爲我工作嗎?

回答

7

您可以使用maven來實現。特別使用resource filtering

首先,你可以定義配置文件的列表:

<profiles> 
    <profile> 
     <id>dev</id> 
     <properties> 
     <env>development</env> 
     </properties> 
     <activation> 
     <activeByDefault>true</activeByDefault> <!-- use dev profile by default --> 
     </activation> 
    </profile> 
    <profile> 
     <id>prod</id> 
     <properties> 
     <env>production</env> 
     </properties> 
    </profile> 
    </profiles> 

然後你需要過濾的資源:

<build> 
    <outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</outputDirectory> 
    <filters> 
     <filter>src/main/filters/filter-${env}.properties</filter> <!-- ${env} default to "development" --> 
    </filters> 
    <resources> 
     <resource> 
     <directory>src/main/resources</directory> 
     <includes> 
      <include>**/*.xml</include> 
      <include>**/*.properties</include> 
     </includes> 
     <filtering>true</filtering> 
     </resource> 
    </resources> 
    </build> 

然後你的自定義屬性基礎上src/main/filters目錄中的配置文件:

filter-development.properties

# profile for developer 
db.driver=org.hsqldb.jdbcDriver 
db.url=jdbc:hsqldb:mem:web 

filter-production.properties

# profile for production 
db.driver=com.mysql.jdbc.Driver 
db.url=jdbc:mysql://localhost:3306/web?createDatabaseIfNotExist=true 

使用生產配置文件,您可以使用mvn clean package -Pprod命令打包戰爭。

Here您可以在maven中看到使用配置文件的示例項目。

+0

謝謝。這看起來有希望。我現在看看示例項目。 –

+0

這很可能是被接受的答案。它似乎也將與JRebel一起工作。 –

+0

在一個多模塊項目中,我想我需要在除父級以外的所有poms中複製它,對吧? –

0

這不是直接回答問題。這解釋了用於管理env屬性的diff策略 另一種管理diff env屬性的方法是使用數據庫來存儲屬性。這樣你只需要管理數據庫的配置。根據您指向哪個數據庫,您可以從該數據庫加載屬性。如果您使用的是彈簧,而不是Spring提供的PropertyPlaceholderConfigurer,它可以從數據庫初始化屬性。這種方法可以讓你在不進行構建的情況下更改屬性值。

如果您想推廣由QA \ Testing團隊測試的工件,此方法非常有用。在這種情況下,數據庫配置不會是構建過程生成的工件的一部分。

+0

對於某些配置項目,這可能會正常,但對於那些只能在部署時定義的配置項目而言,這是不合適的。不過謝謝。 –

+0

你能舉個例子嗎?如果您只是在討論屬性,那麼它可能是部署期間執行的數據庫腳本的一部分。 –

+0

這不適用於我的問題中的例子。但是,它將適用於我已經定義爲常量的屬性。 –