67

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

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

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

语境

我采用了一个开源项目并设法更改数据库配置以使用 JavaDB

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

或系统属性:derby.system.home

我的代码已经可以工作了,但目前它都被硬编码为:

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

我想删除完整路径,让它像:

 jdbc:derby:mydb

为此,我需要将系统属性 ( derby.system.home) 指定给 maven,但我不知道如何。

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

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

4

4 回答 4

82

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

您可以在Maven Surefire 插件配置中设置系统属性(这是有道理的,因为默认情况下测试是分叉的)。从使用系统属性

<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(在本地运行)

不确定您在这里的意思,但我假设 webapp 容器是由 Maven 启动的。您可以使用以下命令在命令行上传递系统属性:

mvn -DargLine="-DpropertyName=propertyValue"

更新:好的,现在知道了。对于 Jetty,您还应该能够在 Maven Jetty 插件配置中设置系统属性。从设置系统属性

<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>
于 2010-07-12T20:26:02.757 回答
75

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>
于 2012-10-31T13:24:48.063 回答
10

我了解到,如果您正在执行“独立”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>
于 2013-12-28T01:25:26.587 回答
2

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

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

于 2010-07-12T20:05:43.990 回答