2009-10-28 94 views
2

我的應用程序需要知道可以存儲其數據的目錄的路徑。我嘗試設置一個Java系統屬性,並將該變量用作Spring XML中的佔位符。使用Maven在Spring XML中無法解析系統屬性

在Eclipse中,我將該屬性添加到我的運行配置的環境中,它工作得很好。 Spring將$ {dataDir}解析爲正確的路徑。

但是,當我使用Maven2測試應用程序(mvn test -DdataDir = c:/ data)時,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> 

爲什麼不說,系統屬性傳遞給春天嗎?我究竟做錯了什麼?感謝您的任何建議!

編輯:當然,你是對的:$ {baseDir}應該是$ {dataDir}。但這只是這個問題的一個錯誤,而不是真正的代碼。

我試圖MAVEN_OPTS之前,但要麼...

+1

應該是baseDir,而不是數據目錄 – toolkit 2009-10-28 15:23:26

+0

工具包,是的,我認爲是。 – 2009-10-28 15:35:59

回答

4

這是Surefire插件2.4.3中的一個已知錯誤。有關詳細信息,請參閱JIRA問題「System properties set on the command line get clobbered」。使用以前的版本,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> 
1

也許MVN測試不通過它與運行的測試系統性能它不工作?是否有可能使用測試插件傳遞屬性(本身可能會將它們從系統屬性中拉出來)?

參見:http://maven.apache.org/maven-1.x/plugins/test/properties.html

+0

這是最好的解決方案 - 在您的POM文件中嵌入任何必需的屬性。通過這種方式,它們與項目一起存儲,以便所有團隊成員都可以訪問它們(並且不必單獨設置它們的env),因此它們受版本控制。 – 2009-10-29 18:29:50

0

如果你看一下mvn腳本,你可以看到,通過命令行傳遞的所有參數作爲參數傳遞給推出類,而不是作爲參數傳遞給JVM。所以-D將無法​​正常工作。

最快的解決方法是定義MAVEN_OPTS環境變量,例如,

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

,然後運行mvn test

+0

我認爲這不再是事實。所選答案中最新添加的與JIRA相關的問題顯示:「通過MAVEN_OPTS直接傳遞到JVM的系統道具不會轉發到測試。」 – Patrick 2010-11-04 23:16:55

0

可能是你應該使用相同的變量名?我的意思是你傳遞dataDir,但期望baseDir。我錯了嗎?

0

我認爲flicken的answer是正確的回答你的問題。

但是,我建議將​​3210文件移動到src/test/resources。這似乎是一個完美的位置(在Maven的世界),這樣,文件將在類路徑中可用(所以你不必使用絕對路徑)。最重要的是,該文件最終會像版本控制中的任何其他資源一樣,這是一件好事。

如果真的要將它保留在項目結構之外,我會使用resources filtering來過濾您的Spring配置文件並在構建時設置${dataDir}

+0

該文件應該存儲在項目之外,因爲當我想更新應用程序時,它不能被覆蓋。但將它保留在版本控制下是一個很好的觀點。必須考慮這一點 – Olvagor 2009-11-03 12:18:40