Author: rgoers Date: Sun Sep 23 15:47:52 2007 New Revision: 578609 URL: http://svn.apache.org/viewvc?rev=578609&view=rev Log: Update documentation to reflect importing of 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=578609&r1=578608&r2=578609&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 Sun Sep 23 15:47:52 2007 @@ -70,7 +70,7 @@ Dependency scope is used to limit the transitivity of a depedency, and also to affect the classpath used for various build tasks. - There are 5 scopes available: + There are 6 scopes available: * <<compile>> - this is the default scope, used if none is specified. Compile dependencies are available @@ -92,13 +92,18 @@ - this scope is similar to provided except that you have to provide the JAR 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. + intersection. If no scope is listed, it means the dependency will be omitted. *----------+------------+----------+----------+------+ | | compile | provided | runtime | test @@ -384,7 +389,160 @@ 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.8 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. * System Dependencies