You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rg...@apache.org on 2008/03/21 23:26:59 UTC
svn commit: r639894 -
/maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt
Author: rgoers
Date: Fri Mar 21 15:26:46 2008
New Revision: 639894
URL: http://svn.apache.org/viewvc?rev=639894&view=rev
Log:
Add back documentation on importing managed dependencies.
Modified:
maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt
Modified: maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt
URL: http://svn.apache.org/viewvc/maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt?rev=639894&r1=639893&r2=639894&view=diff
==============================================================================
--- maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt (original)
+++ maven/site/trunk/src/site/apt/guides/introduction/introduction-to-dependency-mechanism.apt Fri Mar 21 15:26:46 2008
@@ -106,9 +106,14 @@
which contains it explicitly. The artifact is always available and is not
looked up in a repository.
+ * <<import>>
+ - this scope is only used on a dependency of type "pom" in the dependencyManagement section. It indicates that the specified
+ pom should be replaced with the dependencies in that pom's dependencyManagement section. Since they are replaced,
+ dependencies with a scope of import do not actually participate in limiting the transitivity of a dependency.
+
[]
- Each of the scopes affects transitive dependencies in different ways, as is demonstrated in the table below.
+ Each of the scopes (except for import) affects transitive dependencies in different ways, as is demonstrated in the table below.
If a dependency is set to the scope in the left column, transitive dependencies of that dependency with the
scope across the top row will result in a dependency in the main project with the scope listed at the
intersection. If no scope is listed, it means the dependency will be omitted.
@@ -398,6 +403,342 @@
The reference information about the dependency management tags is available from the
{{{../../ref/current/maven-model/maven.html#class_DependencyManagement}project descriptor reference}}.
+** Importing Dependencies
+
+ <The features defined in this section are only available in maven 2.0.9 or later.>
+
+ The examples in the previous section describe how to specify managed dependencies through inheritence. However,
+ in larger projects it may be impossible to accomplish this since a project can only inherit from a single parent.
+ To accomodate this, projects can import managed dependencies from other projects. This is accomplished by declaring a
+ pom artifact as a dependency with a scope of "import".
+
+ Project B:
+
++----+
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>maven</groupId>
+ <artifactId>B</artifactId>
+ <packaging>pom</packaging>
+ <name>B</name>
+ <version>1.0</version>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>maven</groupId>
+ <artifactId>A</artifactId>
+ <version>1.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>test</groupId>
+ <artifactId>d</artifactId>
+ <version>1.0</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>maven-test</groupId>
+ <artifactId>a</artifactId>
+ <version>1.0</version>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>maven-test</groupId>
+ <artifactId>c</artifactId>
+ <scope>runtime</scope>
+ </dependency>
+ </dependencies>
+</project>
+
++----+
+
+ Assuming A is the pom defined in the preceding example, the end result would be the same. All of A's managed dependencies
+ would be incorporated into B except for d since it is defined in this pom.
+
+ Project X:
+
++----+
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>maven</groupId>
+ <artifactId>X</artifactId>
+ <packaging>pom</packaging>
+ <name>X</name>
+ <version>1.0</version>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>test</groupId>
+ <artifactId>a</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>test</groupId>
+ <artifactId>b</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
+
++----+
+
+ Project Y:
+
++----+
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>maven</groupId>
+ <artifactId>Y</artifactId>
+ <packaging>pom</packaging>
+ <name>Y</name>
+ <version>1.0</version>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>test</groupId>
+ <artifactId>a</artifactId>
+ <version>1.2</version>
+ </dependency>
+ <dependency>
+ <groupId>test</groupId>
+ <artifactId>c</artifactId>
+ <version>1.0</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
+
++----+
+
+ Project Z:
+
++----+
+
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>maven</groupId>
+ <artifactId>Z</artifactId>
+ <packaging>pom</packaging>
+ <name>Z</name>
+ <version>1.0</version>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>maven</groupId>
+ <artifactId>X</artifactId>
+ <version>1.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ <dependency>
+ <groupId>maven</groupId>
+ <artifactId>Y</artifactId>
+ <version>1.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+</project>
+
++----+
+
+ In the example above Z imports the managed dependencies from both X and Y. However, both X and Y contain depedency a. Here,
+ version 1.1 of a would be used since X is declared first and a is not declared in Z's dependencyManagement.
+
+ This process is recursive. For example, if X imports another pom, Q, when Z is processed it will simply appear that all
+ of Q's managed dependencies are defined in X.
+
+ Imports are most effective when used for defining a "library" of related artifacts that are generally part of a
+ multiproject build. It is fairly common for one project to use one or more artifacts from these libraries.
+ However, it has sometimes been difficult to keep the versions in the project using the artifacts in synch
+ with the versions distributed in the library. The pattern below illustrates how a "bill of materials" (BOM) can be
+ created for use by other projects.
+
+ The root of the project is the BOM pom. It defines the versions of all the artifacts that will be created
+ in the library. Other projects that wish to use the library should import this pom into the dependencyManagement
+ section of their pom.
+
++----+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.test</groupId>
+ <artifactId>bom</artifactId>
+ <version>1.0.0</version>
+ <packaging>pom</packaging>
+ <properties>
+ <project1Version>1.0.0</project1Version>
+ <project2Version>1.0.0</project2Version>
+ </properties>
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.test</groupId>
+ <artifactId>project1</artifactId>
+ <version>${project1Version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.test</groupId>
+ <artifactId>project2</artifactId>
+ <version>${project1Version}</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <modules>
+ <module>parent</module>
+ </modules>
+</project>
+
++----+
+
+ The parent subproject has the BOM pom as its parent. It is a normal multiproject pom.
+
++----+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.test</groupId>
+ <version>1.0.0</version>
+ <artifactId>bom</artifactId>
+ </parent>
+
+ <groupId>com.test</groupId>
+ <artifactId>parent</artifactId>
+ <version>1.0.0</version>
+ <packaging>pom</packaging>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ <version>1.2.12</version>
+ </dependency>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ <version>1.1.1</version>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <modules>
+ <module>project1</module>
+ <module>project2</module>
+ </modules>
+</project>
+
++----+
+
+ Next are the actual project poms.
+
++----+
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.test</groupId>
+ <version>1.0.0</version>
+ <artifactId>parent</artifactId>
+ </parent>
+ <groupId>com.test</groupId>
+ <artifactId>project1</artifactId>
+ <version>${project1Version}</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>log4j</groupId>
+ <artifactId>log4j</artifactId>
+ </dependency>
+ </dependencies>
+</project>
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>com.test</groupId>
+ <version>1.0.0</version>
+ <artifactId>parent</artifactId>
+ </parent>
+ <groupId>com.test</groupId>
+ <artifactId>project2</artifactId>
+ <version>${project2Version}</version>
+ <packaging>jar</packaging>
+
+ <dependencies>
+ <dependency>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </dependency>
+ </dependencies>
+</project>
+
++----+
+
+ The project that follows shows how the library can now be used in another project without having to
+ specify the dependent project's versions.
+
++----+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.test</groupId>
+ <artifactId>use</artifactId>
+ <version>1.0.0</version>
+ <packaging>jar</packaging>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.test</groupId>
+ <artifactId>bom</artifactId>
+ <version>1.0.0</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.test</groupId>
+ <artifactId>project1</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>com.test</groupId>
+ <artifactId>project2</artifactId>
+ </dependency>
+ </dependencies>
+</project>
+
++----+
+
+ Finally, when creating projects that import dependencies beware of the following:
+
+ * Do not attempt to import a pom that is defined in a submodule of the current pom.
+ Attempting to do that will result in the build failing since it won't be able to locate the pom.
+
+ * Never declare the pom importing a pom as the parent (or grandparent, etc) of the target pom.
+ There is no way to resolve the cicularity and an exception will be thrown.
+
+ * When referring to artifacts whose poms have transitive dependencies the project will need to specify versions
+ of those artifacts as managed dependencies. Not doing so will result in a build failure since the
+ artifact may not have a version specified. (This should be considered a best practice in any case as it
+ keeps the versions of artifacts from changing from one build to the next).
* System Dependencies