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

同一の変数名を使用する必要があるかもしれませんか?つまり、dataDirを渡しますが、baseDirを期待します。私が間違っている?

于 2009-10-28T15:34:44.480 に答える
0

スクリプトを見るmvnと、コマンドラインを介して渡されたすべての引数が、JVMへの引数としてではなく、起動クラスへの引数として渡されていることがわかります。だから-D動作しません。

最も簡単な回避策は、MAVEN_OPTS環境変数を定義することです。

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

その後、実行しますmvn test

于 2009-10-28T15:29:26.087 に答える
0

フリッケンの答えはあなたの質問に対する正しい答えだと思います。

ただし、config.xmlファイルを に移動することをお勧めしますsrc/test/resources。これは (maven の世界では) 完璧な場所のようであり、このようにして、ファイルはクラスパスで利用できるようになります (したがって、絶対パスを使用する必要はありません)。その上、ファイルはプロジェクトの他のリソースと同様にバージョン管理されます。これは良いことです。

本当にプロジェクト構造の外に保持したい場合は、リソース フィルタリングを使用して Spring 構成ファイルをフィルタリングし${dataDir}、ビルド時に設定します。

于 2009-10-31T16:30:16.780 に答える