有没有办法(我的意思是如何)在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 /中运行它)
答案 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。