在我的Maven构建中,我希望能够在pom.xml中定义默认值(例如,用于数据库连接),但我希望用户能够覆盖这些,而无需直接修改pom.xml
举例来说,在Ant构建中,您可以在foo.properties
中定义默认属性,但Ant会在foo.$USERNAME.properties
中查找每个属性的覆盖。后者通常不会检查源代码控制,从而消除了开发人员意外提交默认属性覆盖的问题。 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?
答案 0 :(得分:9)
您可以使用-Dpropertyname=value
在命令行上指定属性,或者用户可以在.m2/settings.xml
中指定属性。
答案 1 :(得分:2)
您可以使用构建配置文件实现此目的。有关详细信息,请参阅Introduction to build profiles。
答案 2 :(得分: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>
元素。
答案 3 :(得分:0)
如果您不想在命令行上添加属性,只需设置一些设置(如果您可以接受默认的空字符串);你可以使用这样的环境变量:
<something>${env.ENVNAME}</something>
<!-- something will be blank "" unless ENVNAME is set -->
编辑:如果变量为空/未定义,我一直试图找到一种定义${variable}
默认值的方法,但我找不到任何东西,这似乎缺少(经常建议使用配置文件,但它不完全相同)。
我更喜欢你可以设置一些环境变量并具有合理的默认值,这样你就可以运行mvn clean install
(而不是我通常用来构建项目的20-40个字符串)。 如果可以使用默认值,我会喜欢听到......