以下示例声明了三个依赖项并将它们添加到dependency.classpath pathId。
<artifact:dependencies pathId="dependency.classpath"> <dependency groupId="junit" artifactId="junit" version="3.8.2" scope="test"/> <dependency groupId="org.codehaus.modello" artifactId="modello-core" version="1.0-alpha-2-SNAPSHOT"/> <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.4" scope="provided"/> </artifact:dependencies>
pathId 可以在 Ant 构建文件中使用,例如在javac任务中。
<javac ...> <classpath refid="dependency.classpath" /> ... </javac>
您可以使用的另一个选项是filesetId,它将为您提供可用于将文件复制到特定位置的文件集引用。例如,要使用您的依赖项填充WEB-INF/lib,您可以使用以下内容:
<artifact:dependencies filesetId="dependency.fileset" useScope="runtime"> <!-- Your dependency definitions go here --> ... </artifact:dependencies> <copy todir="${webapp.output}/WEB-INF/lib"> <fileset refid="dependency.fileset" /> <!-- This mapper strips off all leading directory information --> <mapper type="flatten" /> </copy>
请注意此调用中的useScope属性。这可确保您的 Web 应用程序仅包含您的编译和运行时依赖项,不包括那些仅用于测试或预计已由 servlet 容器提供的依赖项。
您还可以为每个依赖项指定范围参数。这改变了传递依赖的行为,对于构建不同类型的类路径很有用。要了解它如何影响依赖项的行为,请参阅Maven 2.0 站点上的依赖机制文档。
其他选项包括:
例如,要使用文件名中没有版本的依赖项填充lib ,使用相应的源代码的lib/src和使用相应的 javadocs 的lib/javadoc:
<artifact:dependencies filesetId="dependency.fileset" sourcesFilesetId="sources.dependency.fileset" javadocFilesetId="javadoc.dependency.fileset" versionsId="dependency.versions"> <!-- Your dependency definitions go here --> ... </artifact:dependencies> <copy todir="lib"> <fileset refid="dependency.fileset" /> <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper" from="${dependency.versions}" to="flatten" /> </copy> <copy todir="lib/src"> <fileset refid="sources.dependency.fileset" /> <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper" from="${dependency.versions}" to="flatten" /> </copy> <copy todir="lib/javadoc"> <fileset refid="javadoc.dependency.fileset" /> <mapper classpathref="maven-ant-tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper" from="${dependency.versions}" to="flatten" /> </copy>
注意:在上面的例子中你只需要通过声明typedef来指定classpathref="maven-ant-tasks.classpath"如果使用 Maven Ant 任务。如果 Maven Ant Tasks安装在 Ant 的lib目录中,则可以省略。
(自 2.0.8 起)对于使用内联声明或 pom 引用解析的每个依赖项,定义属性groupId:artifactId:type[:classifier]指向相应的文件。例如,可以通过以下方式访问对 junit 的已解析依赖项:
<echo message="JUnit jar file downloaded to ${junit:junit:jar}"/>
使用系统范围的依赖项指定本地系统上的路径,该路径可能位于本地 maven 存储库之外。Ant 文件集只允许单个基目录,因此这些依赖项不会包含在已解析依赖项的生成文件集中。但是,它们将包含在路径对象中。
有两个选项可用于按范围过滤 POM 依赖项:useScope属性和scopes属性。应该使用这些属性中的一个或另一个,但不能同时使用两者。
useScope属性遵循 Maven 的作用域行为约定。这意味着该属性可以设置为三个可能的范围之一:编译、运行时或测试。这些作用域的行为如下。
例如,使用作用域runtime ,在作用域字段中使用compile、runtime或 nothing (默认为compile)定义的任何依赖项都将包含在结果文件集中。
<artifact:dependencies filesetId="deps.fileset" useScope="runtime"> <pom file="mypom.xml"/> </artifact:dependencies>
(自 2.0.10 起)范围属性接受以逗号分隔的范围列表以包含在过滤中。只有具有这些特定范围的依赖项才会包含在生成的文件集中。如果未指定任何值,则包括所有范围。以下示例仅包括范围为provided或test的依赖项。
<artifact:dependencies filesetId="deps.fileset" scopes="provided, test"> <pom file="mypom.xml"/> </artifact:dependencies>
可以使用type属性按类型过滤依赖项。这可以设置为要选择的类型的逗号分隔列表。以下示例将仅包含jar类型的工件。
<artifact:dependencies filesetId="deps.fileset" type="jar"> <pom file="mypom.xml"/> </artifact:dependencies>
默认情况下,构建依赖项列表时将包含所有工件类型。
(自 2.1.0 起)对于具有大型依赖树的项目,解决过程可能需要一些时间。在这些情况下,依赖项任务提供了一个选项来生成一个 Ant 构建文件(默认称为 build-dependencies.xml),该文件包含由依赖项解析生成的属性和引用。该文件可用作缓存以快速加载依赖项工件的路径。或者可以通过导入任务直接在其他 ant 构建文件中使用。
与此功能相关的依赖项任务有两个参数cacheDependencyRefs和dependencyRefsBuildFile。第一个是一个布尔参数,表示是否应该生成构建文件。默认情况下,该文件将创建为“./target/build-dependencies.xml”。第二个参数允许更改默认文件名。
例如,要打开依赖缓存,可以使用以下配置。
<artifact:dependencies cacheDependencyRefs="true"> <pom file="mypom.xml"/> </artifact:dependencies>
第一次运行构建时,依赖项将从存储库中解析,任务将生成一个名为“build-dependencies.xml”的文件。此文件包含在构建期间生成的属性和文件集引用的列表。下次运行构建时,依赖引用将简单地从生成文件中加载。