是否有任何Ant功能,将类路径依赖项复制到WEB-INF / lib?

时间:2012-12-25 10:25:59

标签: ant

我不能影响将类路径依赖项复制到WEB-INF / lib类别的过程:没有特殊的ANT任务复制这些jar(至少,我找不到任何带有相关“WEB-INF”的'copy'任务/ lib“string as PATH argument”,但它们在项目构建后出现。如何影响这个程序?基本上,我需要排除JAXB jar以避免依赖冲突。同时我在编译时需要这个罐子,所以我不能删除它们。也许,使用“删除”任务手动擦除这些罐子会更容易吗?

1 个答案:

答案 0 :(得分:3)

您正在努力解决的是多类路径管理。在典型的构建中,至少有4种类型的路径:

  • 编译:您的代码直接调用的类
  • 运行时:您的代码通过其他类间接调用的类
  • 提供:您需要编译的类,但其实现将由目标平台提供
  • 测试:在测试代码但未随最终应用程序提供时需要的其他类(如junit)

正是Maven构建工具正式识别了这些常见的类路径,并提供了一个依赖管理系统,用于在构建过程中解析和填充类路径。

坏消息是ANT提前Maven,因此将类路径管理完全留给程序员....通常,这是通过将jar放入不同的目录或在构建逻辑中使用复杂的文件集来完成的。

好消息是有一个名为ivy的ANT插件,它执行类似Maven的依赖管理。值得学习的是,特别是如果你使用开源库(现在越来越多地使用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”目标旨在安装常春藤(它没有与ANT核心打包)
  • “cachepath”任务用于创建自定义ANT路径
  • “检索”任务使用运行时所需的jar填充WAR文件的WEB-INF / lib目录(由常春藤配置管理)

的ivy.xml

此文件列出了项目的依赖项。它使用配置逻辑地将jar组合在一起,并使常春藤“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>