2012-05-24 29 views
7

我在我的~/.m2目錄中有一個Maven settings.xml文件;它看起來像這樣:在Spring環境中使用Maven settings.xml屬性

<settings> 
    <profiles> 
     <profile> 
      <id>mike</id> 
      <properties> 
       <db.driver>org.postgresql.Driver</db.driver> 
       <db.type>postgresql</db.type> 
       <db.host>localhost</db.host> 
       <db.port>5432</db.port> 
       <db.url>jdbc:${db.type}://${db.host}:${db.port}/dbname</db.url> 
      </properties> 
     </profile> 
    </profiles> 
    <activeProfiles> 
     <activeProfile>mike</activeProfile> 
    </activeProfiles> 
    <servers> 
     <server> 
      <id>server_id</id> 
      <username>mike</username> 
      <password>{some_encrypted_password}</password> 
     </server> 
    </servers> 
</settings> 

我想兩次

  • 一旦使用Maven的integration-test階段內這些屬性來設置和拆除我的數據庫。使用Maven過濾,這是完美的。
  • 第二次運行我的Spring應用程序時,這意味着我需要在Maven的resources:resources階段將這些屬性替換爲我的servlet-context.xml文件。對於settings.xml上部的屬性,如${db.url},這可以正常工作。 我不知道如何將我的數據庫用戶名和(解密)密碼替換爲Spring servlet-context.xml文件。

servlet-context.xml文件的相關部分看起來像:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

這裏的最終目標是爲每個開發人員擁有(自己的機器進行集成測試上和數據庫)自己的Maven的設置。 ..和Jenkins服務器上的類似設置。我們不想分享一個共同的用戶名/密碼/等。

回答

2

有一種通過配置Maven War Plugin過濾網頁資源的方法。從官方插件的文檔中查看this

順便說一句,我強烈建議重新考慮這種基於過濾的方式,以便在構建時提供事實上的運行時配置。只需注意,您必須重建相同的代碼只准備其他環境的包(或者編輯包內容)。您可以使用應用程序服務器的具體內容(至少JBoss有一個)或使用Spring,AFAIR也可以像這樣配置。

+0

關於重新編譯的那一點是有效的。我肯定會更多地考慮這個問題,因爲這是我希望避免的一種反模式。絕對需要這個以CI/CD風格運行。但同時,我試圖重新使用已存在的信息並存儲在'設置中。xml' – Mike

+0

好吧,這是非常好的,你要重構這個。就目前而言,正如我所說的,使用這個網頁資源過濾。正如你所說,它應該能夠工作並使您能夠在一個地方進行配置。 –

+0

Spring 3.1爲這種類型的場景引入了一些新東西:http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ – artbristol

1

我建議你在中間使用屬性文件。我的意思是:Spring應用程序將使用context:property-placeholder從屬性文件加載屬性值,Maven將使用過濾使用settings.xml中的值替換$ {...}變量。

你的屬性文件:

db.driver=${db.driver} 
db.url=${db.url} 
username=${username} 
password=${password} 

servlet-context.xml文件

<context:property-placeholder location="classpath:your-property-file.properties" /> 

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

在你的pom.xml

<resources> 
    ... 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    ... 
</resources> 
0

我還沒有嘗試過,但按本maven wiki page,您應該能夠使用參考settings.xml中的屬性前綴。因此,${settings.servers.server.username}理想情況下應返回中的username

+0

這是在Maven的範圍,而不是Spring的範圍,所以你不能在運行時訪問那些Spring。你只能使用他們的過濾器選項。 –

相關問題