4

テストで問題が発生しました。有効なlog4j.propertiesがsrc/test / resourcesにあるため、mavenで実行するとlog4jの初期化に失敗するため、テストのクラスパスに到達するはずです。しかし、そうではありません。つまり、log4jは印刷するだけです。

log4j:WARN No appenders could be found for logger (org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.

問題をデバッグするために、ここのコードを使用して、テスト自体からクラスパスを出力しました

しかし、私が取得するjarファイルとパスの長いリストの代わりに

/<projectpath>/target/surefire/surefirebooter6226797341642271676.jar

だから私の質問は:

  1. WTFはクラスパスでMavenを実行していますか?

  2. log4j.propertiesがクラスパスに表示されないのはなぜですか?

  3. これをデバッグするにはどうすればよいですか?

注:Eclipseでは、テストを問題なく実行でき、すべてが期待どおりに機能します。

別の注意:Mavenプロジェクトはマルチモジュールプロジェクトであり、次のようなコマンドラインを使用して、単一のサブモジュールから単一のテストのみを実行しています。

mvn -U -Dtest=de.company.project.SomeTest clean test
4

2 に答える 2

3

maven-surefire-pluginをよく見てください。デフォルトでは、クラスパス全体を詰めた jar を作成します。これは、useManifestOnlyJarオプションによって制御されます。これは、Windows のクラスパス制限が 1024 であるという問題を回避します (私の頭の上から引用します)。Linux では、制限がはるかに高いため、この問題をそれほど感じることはありません。

maven-surefire-plugin をフォークする場合、Maven (およびコンパイル) を実行しているクラスパスとは異なるクラスパスが使用されます。

この種のくだらない状況をデバッグするには、次のようにします。

  • テストの 1 つに、すべての環境変数と Java システム プロパティを一覧表示するループを追加します。

  • テストをデバッグします。

    mvn -Dmaven.surefire.debug="-Xdebug \
        -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=9001 \
        -Xnoagent" \
        test
    
于 2013-03-19T15:23:59.103 に答える
0

質問1の答えを見つけました。

Maven はその場で奇妙な名前の jar を作成し、そこに MANIFEST.MF ファイルを配置します。このファイルには、クラスパスと、開始するメイン クラスが含まれています。

これは、いくつかの拡張質問 3 にも回答します。

Mavenの実行中にそのjarファイルを別の場所にコピーできるため、終了しても削除されません。その後、必要なだけ調べることができます。私のlog4.propertiesがクラスパス上にあることがわかりました(テストクラスのターゲットディレクトリがそこにあり、プロパティファイルがそのディレクトリにあります....)

質問 2 を残します。

pom.xml の森のどこかで、システム プロパティ log4j.configuration がかなり役に立たない値に設定されていることが判明しました。ここで説明されているように、その値を適切な値に戻すと、当面の問題は解決しました。

今はポンポンの壊れた場所を見つけなければなりませんが、それは別の日の話です.

于 2013-03-19T13:13:42.413 に答える