2

使用しようとしている Ant build.xml スクリプトがあります。その中で、いくつかの junit テストを実行するための taskdef を追加しました。しかし、恐ろしいクラスパスの問題に直面しています。

これは weblogic アプリケーションであるため、Weblogic は ANT_HOME を Weblogic ANT バージョン 1.6.5 に設定します。さらに、JUnit 4 を使用しようとしていますが、Weblogic に付属の JUnit は JUnit 3 ベースです (私は信じています)。

Weblogic バージョンで実行するのではなく、プロジェクトでチェックインした Ant および JUnit jar を使用するように Ant に指示するのは簡単なことだと思いましたが、これを機能させることができませんでした。

これが私が今持っているものです:

<path id="junit.classpath">
    <fileset dir="${applib.dir}">
        <include name="junit-4.10.jar"/>
    </fileset>
</path>

<taskdef name="myjunit"
  classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"
  classpathref="junit.classpath">

    <classpath>
        <!-- These are here so that the junit task runs with these jars, which works -->
        <pathelement location="${applib.dir}/junit-4.10.jar"/>
        <pathelement location="${applib.dir}/ant-1.8.2/ant-junit4.jar"/>
    </classpath>
</taskdef>

ただし、何をしても、Ant のクラスパスには JUnit/framework/Test が含まれていません。

BUILD FAILED
    C:\build.xml:219: taskdef A class needed by class org.apache.tools.ant.taskdefs.optional.junit.JUnitTask cannot be found: j
unit/framework/Test

問題は、Weblogic によって ANT_HOME が設定されているため、Ant の起動時に ant-junit.jar がクラスパスに追加されていることだと思います。ant -diagnostics はこれを確認します。

これを解決できた唯一の方法は、junit-4.10.jar をクラスパスに直接配置するか、BEA ANT_HOME ライブラリ ディレクトリに配置することです。ただし、それは本番環境では機能しません。

では、タスク定義によって Ant がクラッシュしないように、junit-4.10.jar を Ant クラスパスに追加するにはどうすればよいでしょうか。

  • このタスクは、コードのビルド中に JUnit テストを実行するためにのみ使用され、デプロイには必要ありません。
  • このスクリプトを使用するすべてのマシンに ANT と JUNIT をインストールすることは、実際にはオプションではありません。
  • 複数のプラットフォーム (UNIX および Windows) で同じビルド スクリプトを実行できる必要があります。Windows はコードのビルド用、Linux は Weblogic へのデプロイ用です。
  • 問題のタスクを実行するつもりもない展開段階で Ant をシャットダウンするためだけに、本番パッケージで JUnit および ANT jar を提供する必要はありません。
  • junit テストをコンパイル/実行するためだけに個別の build.xml ファイルを用意することもできますが、それではコードが重複し、面倒なように思えます。

これに対処する方法について何か提案はありますか?

4

1 に答える 1

1

次のような PATH を強制するための DOS バッチ ファイルなどのラッパー スクリプトはどうでしょうか。

set ANT_HOME=C:\ant\ant-1.8.2
set PATH=%PATH%;%ANT_HOME%\bin
ant -f C:\mybuild.xml...

Unix と Windows の両方で単一のスクリプトを実行する必要があることはわかっています。しかし、ここでその考えは意味がありますか?

于 2012-08-07T03:53:06.050 に答える