2011-06-22 60 views
5

在我的Maven構建中,我希望能夠在pom.xml中定義默認值(例如用於數據庫連接),但我希望用戶能夠覆蓋這些值而不必修改pom.xml直。作爲示例,在Ant版本中,您可以在foo.properties中定義默認屬性,但是Ant將在foo.$USERNAME.properties中查找其中每個屬性的替代。後者通常不會被檢入到源代碼控制中,從而消除了開發人員意外提交覆蓋默認屬性的問題。 Maven是否提供類似的設施?每個用戶Maven屬性

爲了使問題更具體一點,假設我有以下的pom.xml

<properties> 
    <db.url>jdbc:jtds:sqlserver://10.10.10.10:1433/somedb</db.url> 
    <db.driver>net.sourceforge.jtds.jdbc.Driver</db.driver> 
    <db.username>default_user</db.username> 
    <db.password>secret</db.password> 
</properties> 

定義的用戶可以覆蓋這些屬性,而無需直接編輯pom.xml的?

回答

9

您可以使用-Dpropertyname=value在命令行上指定屬性,或者用戶可以在它們的.m2/settings.xml中指定屬性。

+0

+1 settings.xml文件是用戶的本地文件 - 這種事最好的地方 – Qwerky

+0

看起來我可以通過在'settings.xml'中定義一個''配置文件來實現這一點,該配置文件包含壓倒一切的財產價值,是嗎? –

+0

如果在構建時完全指定_any_配置文件,您可以但是知道activeByDefault配置文件未被選中。我只是把它們放在POM的普通屬性部分,如果我是你,並讓用戶覆蓋它們。 – artbristol

2

您可以通過構建配置文件來實現此目的。有關更多信息,請參閱Introduction to build profiles

+0

您能否提供一個示例說明如何使用構建配置文件解決上述問題DB連接問題? –

0

如果您不想在命令行中添加屬性,但是設置了一次設置(並且您可以接受缺省值爲空字符串);你可以使用環境變量是這樣的:

<something>${env.ENVNAME}</something> 
<!-- something will be blank "" unless ENVNAME is set --> 

編輯:我一直試圖找到定義${variable}默認值的方式,如果變量爲空/未定義的,但我沒有發現任何東西,這似乎是缺少的(頻繁的建議是使用配置文件,但它不完全相同)。 我寧願如果你可以設置一些環境變量並且有合理的默認值,這樣你就可以運行mvn clean install(而不是我通常用來構建項目的20-40個字符串)。 如果默認值是可能的我想聽聽如何...

順便說一句,如果你已經習慣了螞蟻,我聽說你可以以某種方式從maven調用Ant任務(不知道如何,雖然),也許你可以使用它,不知何故?

+0

感謝您的建議,但空字符串的默認值將不起作用 –

1

我用settings.xml通過向覆蓋這些特性以下到<profiles>

<profile> 
    <id>override-database-properties</id> 
    <activation> 
    <property> 
     <name>refreshDB</name> 
    </property> 
    </activation> 

    <properties> 
    <db.schema_name>store_don</db.schema_name> 
    </properties> 
</profile> 

在這種情況下,如果一個-DrefreshDB傳遞給mvn命令的重寫纔會生效。要激活這些覆蓋每次Maven是還調用添加以下settings.xml

<activeProfiles> 
    <activeProfile>alwaysActiveProfile</activeProfile> 
</activeProfiles> 

如果配置文件被添加到<activeProfiles>那麼<activation>元素應該被刪除。