我不能影响将类路径依赖项复制到 WEB-INF/lib 类别的过程:没有复制这些 jar 的特殊 ANT 任务(至少,我找不到任何与“WEB-INF/lib”相关的“复制”任务string 作为 PATH 参数),但它们出现在项目构建之后。如何影响此程序?基本上,我需要排除 JAXB jar 以避免依赖冲突。同时我在编译时需要这个 jars,所以我不能删除它们。也许,使用“删除”任务手动擦除这些罐子更容易?
问问题
2875 次
1 回答
4
您所苦苦挣扎的是多类路径管理。在典型的构建中,至少有 4 种类型的类路径:
- compile:您的代码直接调用的类
- runtime:您的代码通过其他类间接调用的类
- 提供:您需要编译的类,但其实现将由目标平台提供
- test:测试代码时需要的其他类(如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>
示例(使用常春藤)
对常春藤及其任务的高级介绍。请参阅下面的“检索”常春藤任务,它提供了您正在寻找的功能。
构建.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 路径
- “检索”任务使用运行时所需的 jars 填充 WAR 文件的 WEB-INF/lib 目录(由 ivy 配置管理)
常春藤.xml
该文件列出了您项目的依赖项。它使用配置在逻辑上将 jar 组合在一起,并启用 ivy “cachpath” 任务以在您的构建中创建匹配的类路径。最后,在构建过程中下载并缓存了第 3 方 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 回答