为Maven项目指定系统属性

时间:2010-07-12 19:57:06

标签: maven-2 system-properties

有没有办法(我的意思是如何)在maven项目中设置系统属性?

我想从我的测试和我的webapp(本地运行)访问一个属性,我知道我可以使用java系统属性。

我应该把它放在./settings.xml或类似的东西吗?

上下文

我参加了一个开源项目并设法将数据库配置更改为使用JavaDB

现在,在JavaDB的jdbc url中,可以将数据库的位置指定为完整路径(请参阅:this other question

或系统属性:derby.system.home

我已经使用了代码,但目前它已全部硬编码:

 jdbc:derby:/Users/oscarreyes/javadbs/mydb

我想删除完整路径,将其保留为:

 jdbc:derby:mydb

要做到这一点,我需要为maven指定系统属性(derby.system.home),但我不知道如何。

使用junit执行测试(我在pom.xml中看不到任何插件),并且web应用程序使用jetty插件运行。

在命令行中指定系统属性似乎适用于jetty,但我不确定这是否实用(授予其他一些用户可以从eclipse / idea /中运行它)

4 个答案:

答案 0 :(得分:66)

  

有没有办法(我的意思是如何)在maven项目中设置系统属性?我想从我的测试[...]

访问一个属性

您可以在Maven Surefire Plugin配置中设置系统属性(这是有道理的,因为默认情况下测试是分叉的)。来自Using System Properties

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.5</version>
        <configuration>
          <systemPropertyVariables>
            <propertyName>propertyValue</propertyName>
            <buildDirectory>${project.build.directory}</buildDirectory>
            [...]
          </systemPropertyVariables>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
  

和我的webapp(在本地运行)

不确定你的意思,但我认为Web应用程序容器是由Maven启动的。您可以使用以下命令在命令行上传递系统属性:

mvn -DargLine="-DpropertyName=propertyValue"

更新:好的,现在就知道了。对于Jetty,您还应该能够在Maven Jetty Plugin配置中设置系统属性。来自Setting System Properties

<project>
  ...
  <plugins>
    ...
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>maven-jetty-plugin</artifactId>
        <configuration>
         ...
         <systemProperties>
            <systemProperty>
              <name>propertyName</name>
              <value>propertyValue</value>
            </systemProperty>
            ...
         </systemProperties>
        </configuration>
      </plugin>
  </plugins>
</project>

答案 1 :(得分:60)

properties-maven-plugin插件可能有所帮助:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0.0</version>
    <executions>
        <execution>
            <goals>
                <goal>set-system-properties</goal>
            </goals>
            <configuration>
                <properties>
                    <property>
                        <name>my.property.name</name>
                        <value>my.property.value</value>
                    </property>
                </properties>
            </configuration>
        </execution>
    </executions>
</plugin>

答案 2 :(得分:9)

我已经了解到,如果您正在使用“独立”Java应用程序,也可以使用exec-maven-plugin执行此操作。

            <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>${maven.exec.plugin.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <mainClass>${exec.main-class}</mainClass>
                <systemProperties>
                    <systemProperty>
                        <key>myproperty</key>
                        <value>myvalue</value>
                    </systemProperty>
                </systemProperties>
            </configuration>
        </plugin>

答案 3 :(得分:2)

如果您的测试和Web应用程序位于同一个Maven项目中,则可以使用项目POM中的属性。然后,您可以过滤某些文件,这些文件将允许Maven在这些文件中设置属性。有不同的过滤方式,但最常见的是在资源阶段 - http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-description.html

如果测试和webapp位于不同的Maven项目中,您可以将该属性放在settings.xml中,该文件位于Windows上的maven存储库文件夹(C:\ Documents and Settings \ username.m2)中。您仍然需要使用过滤或其他方法将属性读入您的测试和webapp。