2

我的应用程序需要知道可以存储其数据的目录的路径。我尝试设置 Java 系统属性并将该变量用作 Spring XML 中的占位符。

在 Eclipse 中,我将该属性添加到我的运行配置环境中,它工作得很好。Spring 将${dataDir}解析为正确的路径。

但是当我使用 Maven2 ( mvn test -DdataDir=c:/data ) 测试应用程序时,Spring 抱怨它无法解析占位符。

我的 Spring XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx.xsd">

 <!-- Allows me to use system properties in this file -->
 <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" />

 <bean id="xmlConfiguration" class="org.apache.commons.configuration.XMLConfiguration">
  <constructor-arg index="0">
   <value>${dataDir}/conf/config.xml</value>
  </constructor-arg>
 </bean>
</beans>

为什么不将该系统属性传递给 Spring?我究竟做错了什么?感谢您的任何建议!

编辑:当然,你是对的:${baseDir} 应该是 ${dataDir}。但这只是这个问题的一个错字,而不是真正的代码。

我之前尝试过MAVEN_OPTS但它也不起作用......

4

5 回答 5

4

这是 Surefire 插件 2.4.3 中的一个已知错误。有关详细信息,请参阅 JIRA 问题“命令行上设置的系统属性被破坏”。请改用以前的版本 2.4.2:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <!-- Use 2.4.2 because 2.4.3 has bug with system properties
           see http://jira.codehaus.org/browse/SUREFIRE-121 -->
      <version>2.4.2</version>
    </plugin>
  </plugins>
</build>
于 2009-10-29T18:24:51.837 回答
1

也许 mvn test 没有通过它运行到测试的系统属性?是否可以使用测试插件传递属性(它本身可能会从系统属性中提取它们)?

另见:http ://maven.apache.org/maven-1.x/plugins/test/properties.html

于 2009-10-28T15:24:43.317 回答
0

如果查看mvn脚本,您会看到通过命令行传递的所有参数都作为参数传递给启动类,而不是作为 JVM 的参数。所以-D行不通。

最快的解决方法是定义MAVEN_OPTS环境变量,例如

set MAVEN_OPTS="-DdataDir=c:/data"

然后运行mvn test

于 2009-10-28T15:29:26.087 回答
0

也许你应该使用相同的变量名?我的意思是你传递 dataDir,但期望 baseDir。我错了吗?

于 2009-10-28T15:34:44.480 回答
0

我认为flicken的答案是您问题的正确答案。

但是,我建议将config.xml文件移动到src/test/resources. 这似乎是一个完美的位置(在 Maven 的世界中),这样,该文件将在类路径上可用(因此您不必使用绝对路径)。最重要的是,该文件将像项目的任何其他资源一样最终进入版本控制,这是一件好事。

如果您真的想将其保留在项目结构之外,我会使用资源过滤来过滤您的 Spring 配置文件并${dataDir}在构建时设置。

于 2009-10-31T16:30:16.780 回答