0

クラスパスの依存関係をWEB-INF/libカテゴリにコピーする手順に影響を与えることはできません。これらのjarをコピーする特別なANTタスクはありません(少なくとも、関連する「WEB-INF/lib」を含む「コピー」タスクは見つかりません。 PATH引数としての文字列)が、プロジェクトの構築後に表示されました。この手順に影響を与える方法は?基本的に、依存関係の競合を回避するためにJAXBjarを除外する必要があります。同時に、コンパイル時にこのjarが必要になるため、削除できません。たぶん、「削除」タスクを使用して、これらのjarファイルを手動で消去する方が簡単ですか?

4

1 に答える 1

4

あなたが苦労しているのは、複数のクラスパス管理です。典型的なビルドには、少なくとも 4 種類のクラスパスがあります。

  • compile : コードが直接呼び出すクラス
  • runtime : コードが他のクラスを介して間接的に呼び出すクラス
  • provided : コンパイルする必要があるが、その実装がターゲット プラットフォームによって提供されるクラス
  • test : コードをテストするときに必要であるが、最終的なアプリケーションには同梱されない追加のクラス (junit など)

これらの一般的なクラスパスを正式に識別し、ビルド プロセス中にクラスパスを解決および設定するための依存関係管理システムを提供したのは、Mavenビルド ツールでした。

悪いニュースは、ANT はMavenよりも前のバージョンであるため、クラスパスの管理は完全にプログラマーに委ねられていることです。通常、これは、jar を別のディレクトリに配置するか、ビルド ロジック内で複雑なファイルセットを使用することによって行われます。

良いニュースは、 Maven のような依存関係管理を実行するivyと呼ばれる ANT プラグインがあることです。特に、オープン ソース ライブラリ (最近では Maven の使用が増えています) を使って多くのプログラミングを行う場合は、学ぶ価値があります。

例(アイビーなし)

個々のクラスパスを構成するファイルは、ビルドの最上位で管理する必要があります。明らかに、ファイルは「lib」ディレクトリに個別にダウンロードする必要があります。ファイルの数が増えると、このアプローチは扱いにくくなります。

<project name="demo" default="build">

    <!-- 
    ================
    File collections 
    ================
    -->
    <fileset dir="lib" id="compile.files">
        <include name="*.jar"/>
        <exclude name="slf4j-log4j12.jar"/>
        <exclude name="log4j.jar"/>
        <exclude name="junit.jar"/>
        <exclude name="hamcrest-core.jar"/>
    </fileset>

    <fileset dir="lib" id="runtime.files">
        <include name="*.jar"/>
        <exclude name="junit.jar"/>
        <exclude name="hamcrest-core.jar"/>
    </fileset>

    <fileset dir="lib" id="test.files">
        <include name="*.jar"/>
    </fileset>

    <!--
    ===============
    Compile targets
    ===============
    -->
    ..
    ..

    <target name="compile" depends="init,resolve, resources" description="Compile code">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true">
            <classpath>
                <fileset refid="compile.files"/>
            </classpath>
        </javac>
    </target>

    <!--
    ===============
    Distribution targets
    ===============
    -->
    ..
    ..

    <target name="package" depends="test" description="Create the WAR file">
        <copy todir="build/lib">
            <fileset refid="runtime.files"/>
        </copy>

        <war destfile="${war.file}" webxml="${resources.dir}/web.xml">
            <fileset dir="${resources.dir}" excludes="web.xml"/>
            <lib dir="${build.dir}/lib"/>
        </war>
    </target>

例(アイビーを使用)

アイビーとそのタスクの非常に高レベルな紹介。探している機能を提供する以下の「取得」アイビー タスクを参照してください。

build.xml

<project name="demo" default="build" xmlns:ivy="antlib:org.apache.ivy.ant">

    <!--
    ===========
    Build setup
    ===========
    -->
    <target name="bootstrap" description="Install ivy">
        <mkdir dir="${user.home}/.ant/lib"/>
        <get src="http://search.maven.org/remotecontent?filepath=org/apache/ivy/ivy/2.2.0/ivy-2.2.0.jar"
             dest="${user.home}/.ant/lib/ivy.jar"/>
    </target>

    <!--
    ============================
    Resolve project dependencies
    ============================
    -->
    <target name="resolve" description="Use ivy to resolve classpaths">
        <ivy:resolve/>

        <ivy:report todir='${ivy.reports.dir}' graph='false' xml='false'/>

        <ivy:cachepath pathid="compile.path" conf="compile"/>
        <ivy:cachepath pathid="runtime.path" conf="runtime"/>
        <ivy:cachepath pathid="test.path"    conf="test"/>
    </target>

    <!--
    ===============
    Compile targets
    ===============
    -->
    ..
    ..

    <target name="compile" depends="init,resolve, resources" description="Compile code">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false" debug="true" classpathref="compile.path"/>
    </target>

    <!--
    ===============
    Distribution targets
    ===============
    -->
    ..
    ..

    <target name="package" depends="test" description="Create the WAR file">
        <ivy:retrieve pattern="${build.dir}/lib/[artifact].[ext]" conf="runtime"/>

        <war destfile="${war.file}" webxml="${resources.dir}/web.xml">
            <fileset dir="${resources.dir}" excludes="web.xml"/>
            <lib dir="${build.dir}/lib"/>
        </war>
    </target>

ノート

  • 「bootstrap」ターゲットは、ivy をインストールするように設計されています (ANT コアにはパッケージ化されていません)。
  • 「cachepath」タスクは、カスタム ANT パスを作成するために使用されます
  • 「取得」タスクは、WAR ファイルの WEB-INF/lib ディレクトリに、実行時に必要な jar を取り込みます (ivy 構成によって管理されます)。

アイビー.xml

このファイルには、プロジェクトの依存関係がリストされています。構成を使用して jar を論理的にグループ化し、ivy の "cachpath" タスクがビルド内で一致するクラスパスを作成できるようにします。最後に、ビルド プロセス中にサード パーティの jar ファイルがダウンロードされ、キャッシュされます。これは非常に便利で、プロジェクトのサイズを縮小できることを意味します。

<ivy-module version="2.0">
    <info organisation="com.myspotontheweb" module="demo"/>

    <configurations>
        <conf name="compile" description="Required to compile application"/>
        <conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
        <conf name="test"    description="Required for test only" extends="runtime"/>
    </configurations>

    <dependencies>
        <!-- compile dependencies -->
        <dependency org="org.slf4j" name="slf4j-api" rev="1.7.2" conf="compile->default"/>

        <!-- runtime dependencies -->
        <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.2" conf="runtime->default"/>

        <!-- test dependencies -->
        <dependency org="junit" name="junit" rev="4.10" conf="test->default"/>
    </dependencies>

</ivy-module>
于 2012-12-25T14:21:31.100 に答える