| ------ |
| Dependencies |
| ------ |
| Brett Porter |
| Hervé Boutemy |
| Paul Gier |
| ------ |
| 2009-05-07 |
| ------ |
| |
| ~~ Licensed to the Apache Software Foundation (ASF) under one |
| ~~ or more contributor license agreements. See the NOTICE file |
| ~~ distributed with this work for additional information |
| ~~ regarding copyright ownership. The ASF licenses this file |
| ~~ to you under the Apache License, Version 2.0 (the |
| ~~ "License"); you may not use this file except in compliance |
| ~~ with the License. You may obtain a copy of the License at |
| ~~ |
| ~~ http://www.apache.org/licenses/LICENSE-2.0 |
| ~~ |
| ~~ Unless required by applicable law or agreed to in writing, |
| ~~ software distributed under the License is distributed on an |
| ~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| ~~ KIND, either express or implied. See the License for the |
| ~~ specific language governing permissions and limitations |
| ~~ under the License. |
| |
| ~~ NOTE: For help with the syntax of this file, see: |
| ~~ http://maven.apache.org/doxia/references/apt-format.html |
| |
| Basic Example |
| |
| The following example declares three dependencies and adds them to the <<<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> |
| ----- |
| |
| The pathId can be used in the Ant build file for example in the <<<javac>>> task. |
| |
| ----- |
| <javac ...> |
| <classpath refid="dependency.classpath" /> |
| ... |
| </javac> |
| ----- |
| |
| Using FileSets and the Version Mapper |
| |
| Another option you can use is <<<filesetId>>>, which will give you a fileset reference that can be used to copy |
| files into a particular location. For example, to populate <<<WEB-INF/lib>>> with your dependencies |
| you could use the following: |
| |
| ----- |
| <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> |
| ----- |
| |
| Note the <<<useScope>>> attribute in this call. This ensures that your web application only includes your compile |
| and runtime dependencies, excluding those that are only for testing or are expected to already be provided by |
| the servlet container. |
| |
| You can also specify a <<<scope>>> parameter on each dependency. This changes the behavior of |
| transitive dependencies and is useful for building different types of classpaths. To see how it affects |
| the behaviour of the dependencies, see the {{{http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html} Dependency Mechanism}} |
| documentation on the Maven 2.0 site. |
| |
| Other options are: |
| |
| * <<<sourcesFilesetId>>>, which will give you a fileset reference containing sources artifacts, <(since 2.0.6)> |
| |
| * <<<javadocFilesetId>>>, which will give you a fileset reference containing javadoc artifacts, <(since 2.0.9)> |
| |
| * {<<<versionsId>>>}, which can be used to drop version numbers in filenames <(since 2.0.7)> |
| |
| For example, to populate <<<lib>>> with your dependencies without the version in the filenames, <<<lib/src>>> with the corresponding sources |
| and <<<lib/javadoc>>> with the corresponding javadocs: |
| |
| ----- |
| <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> |
| ----- |
| |
| <<Note:>> In the above example you only need to specify |
| <<<classpathref="maven-ant-tasks.classpath">>> if are using Maven Ant Tasks |
| by {{{../installation.html#typedef} declaring a <<<typedef>>>}}. |
| It can be omitted if Maven Ant Tasks was |
| {{{../installation.html#lib} installed in Ant's <<<lib>>> directory}}. |
| |
| Using Properties to Access Dependencies |
| |
| <(since 2.0.8)> For each dependency resolved using either inline declaration or a pom reference, the property |
| <<<groupId:artifactId:type[:classifier]>>> is defined pointing to the corresponding file. For example, |
| a resolved dependency on junit can be accessed in the following way: |
| |
| ----- |
| <echo message="JUnit jar file downloaded to ${junit:junit:jar}"/> |
| ----- |
| |
| Note about system scope |
| |
| Dependencies that use the <<<system>>> scope specify a path on the local system that may be outside |
| of the local maven repository. An Ant fileset only allows a single base directory, so these |
| dependencies will not be included in the generated fileset for resolved dependencies. They will, however, be included |
| in the path object. |
| |
| Filtering Dependencies by Scope |
| |
| There are two options available for filtering POM dependencies by scope: the <<<useScope>>> |
| attribute, and the <<<scopes>>> attribute. One or the other of these attributes should be used |
| but not both. |
| |
| The <<<useScope>>> attribute follows the Maven conventions for scoping behaviour. This means the attribute |
| can be set to one of three possible scopes: compile, runtime, or test. These scopes will |
| behave as follows. |
| |
| * <<<compile>>> - Includes scopes <<<compile>>>, <<<system>>> and <<<provided>>> |
| |
| * <<<runtime>>> - Includes scopes <<<compile>>> and <<<runtime>>> |
| |
| * <<<test>>> - Includes scopes <<<system>>>, <<<provided>>>, <<<compile>>>, <<<runtime>>> and <<<test>>> |
| |
| For example, using the scope <<<runtime>>>, any dependencies defined with <<<compile>>>, |
| <<<runtime>>>, or nothing (defaults to <<<compile>>>) in the <<<scope>>> field will be included in |
| the resulting fileset. |
| |
| ----- |
| <artifact:dependencies filesetId="deps.fileset" useScope="runtime"> |
| <pom file="mypom.xml"/> |
| </artifact:dependencies> |
| ----- |
| |
| <(Since 2.0.10)> The <<<scopes>>> attribute accepts a comma separated list of scopes to |
| include in the filtering. Only dependencies with these specific scopes will be |
| included in the resulting fileset. If no value is specified, all scopes are included. |
| The following example includes only dependencies with a scope of either <<<provided>>> or <<<test>>>. |
| |
| ----- |
| <artifact:dependencies filesetId="deps.fileset" scopes="provided, test"> |
| <pom file="mypom.xml"/> |
| </artifact:dependencies> |
| ----- |
| |
| |
| Filtering Dependencies by Type |
| |
| Dependencies can be filtered by type by using the <<<type>>> attribute. This can be set to a |
| comma separated list of the types to select. The following example will only include artifacts of the <<<jar>>> type. |
| |
| ----- |
| <artifact:dependencies filesetId="deps.fileset" type="jar"> |
| <pom file="mypom.xml"/> |
| </artifact:dependencies> |
| ----- |
| |
| By default, all artifact types will be included when building the list of dependencies. |
| |
| |
| Generating an Ant build with the dependency properties and references |
| |
| <(Since 2.1.0)> For a project with a large dependency tree, the resolution process can take some time. |
| In these cases, the dependencies task provides an option to generate an Ant build file (called build-dependencies.xml |
| by default) that contains properties and references generated by the dependency resolution. This file can be |
| used as a cache to quickly load the paths to the dependency artifacts. Or it can be used directly in |
| other ant build files via the <<import>> task. |
| |
| There are two parameters to the dependencies task related to this feature <<cacheDependencyRefs>> and |
| <<dependencyRefsBuildFile>>. The first is a boolean parameter to say whether the build file should be |
| generated. By default the file will be created as "./target/build-dependencies.xml". The second parameter |
| allows the default file name to be changed. |
| |
| For example, to turn on the dependency cache, the following configuration could be used. |
| |
| ----- |
| <artifact:dependencies cacheDependencyRefs="true"> |
| <pom file="mypom.xml"/> |
| </artifact:dependencies> |
| ----- |
| |
| The first time the build is run, the dependencies will be resolved from the repository, and the task |
| will generate a file called "build-dependencies.xml". This file contains a list of the properties |
| and fileset references generated during the build. The next time the build is run, the dependency |
| references will simply be loaded from the generate file. |
| |
| |
| |