每用户Maven属性

时间:2011-06-22 09:11:41

标签: java maven-2

在我的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?

4 个答案:

答案 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个字符串)。 如果可以使用默认值,我会喜欢听到......

顺便说一下,如果你已经习惯了Ant,我听说你可以以某种方式从maven调用Ant任务(虽然不知道怎么样),也许你可以用某种方式使用它?