指定系统属性为Maven项目

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

我想从我的testing和我的webapp(本地运行)访问属性,我知道我可以使用Java系统属性。

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

上下文

我采取了一个开源项目,并设法改变数据库configuration使用JavaDB

现在,在JavaDB的jdbc url中,可以将数据库的位置指定为完整path(请参阅: 另一个问题 )

或者是一个系统属性: derby.system.home

我的代码已经工作了,但是目前全部都是硬编码的:

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

我想删除完整的path,离开它:

  jdbc:derby:mydb 

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

testing是使用junit(我没有在pom.xml中看到任何插件)执行,并且web应用程序与jetty插件一起运行。

在命令行中指定系统属性似乎适用于jetty,但我不确定这是否是实际的东西(准许其他用户可以从eclipse / idea / whatever运行它)

有没有一种方法(我的意思是如何)在maven项目中设置系统属性? 我想从我的testing访问一个属性[…]

您可以在Maven Surefire插件configuration中设置系统属性(这是有道理的,因为testing默认是分叉的)。 从使用系统属性 :

 <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插件configuration中设置系统属性。 从设置系统属性 :

 <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> 

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> 

我知道如果你正在做一个“独立”的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> 

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

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