`

Maven构建之依赖传递

阅读更多
如果断Maven的依赖构建必须每一个项目都指定,那配置是累死人了,比如A依赖了20个项目,B依赖A,那么还要添加20个项目,那就悲剧了,maven有依赖传递的功能。
1、Transitive Dependency (传递依赖)
你的项目依赖于A,A又依赖于B。你的项目是否要声明你依赖于B? Maven的回答是它帮你自动管理这种依赖的传递,你不需要声明你依赖于B,由Maven来做。
[版本还是要自己指定的.]
2、Dependency Scope (依赖范围)
因此,Maven考虑了6中可能的scope供选择:
- compile: 默认的scope。编译、测试、打包全都需要。compile参与依赖传递,就是说,你的项目A依赖于B(依赖scope是compile),项目C依赖于你的项目A,那么C也就依赖于B。
- provided: 表示JDK或者容器会在Runtime时提供这些(jar),如上面说到的servlet api。provided的东西在编译和测试时会用到,不参与传递依赖。
- runtime: 表示编译时不需要,但测试和运行时需要,最终打包时会包含进去。
- test: 只用于测试阶段(测试的编译和测试的运行),典型的就是junit的jar。
- system: 和provided类似,但要求jar是你的系统里已有的,不会在repository里找,如rt.jar,tools.jar这些。
- import: 简单的说,你的项目的pom可以继承另一个项目的pom,从而继承了父项目的依赖关系,但是因为之后single inheritance的限制,所以创造了import,使得你可以“导入”或者说“继承”任何一到多个项目的依赖关系。
3. 依赖管理(dependencyManagement)
实际的项目中,你会有一大把的Maven模块,而且你往往发现这些模块有很多依赖是完全项目的,A模块有个对spring的依赖,B模块也有,它们的依赖配置一模一样,同样的groupId, artifactId, version,或者还有exclusions, classifer。细心的分会发现这是一种重复,重复就意味着潜在的问题,Maven提供的dependencyManagement就是用来消除这种重复的。

为了实现项目间的依赖,一般情况下,web项目依赖于app项目,而app项目很可能依赖于其他的app项目,比如我建了一个util项目,app依赖于util,那么webapp也需要依赖于util,但是我不配置webapp依赖util,验证一下,会不会自动加载依赖包.

util项目的构建请参照前讲,接下来看maven配置:
util配置;
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>demo</artifactId>
    <groupId>com.test</groupId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <groupId>com.test.util</groupId>
  <artifactId>util</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>util</name>
  <url>http://maven.apache.org</url>

   	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>


  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>


app项目的maven配置:
<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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.test</groupId>
		<artifactId>demo</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>

  <groupId>com.test.app</groupId>
  <artifactId>app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>app</name>
  <url>http://maven.apache.org</url>

  	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

  <dependencies>

	<dependency>
       <groupId>com.test.util</groupId>
  		<artifactId>util</artifactId>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>

  </dependencies>
</project>


webapp的maven配置:
<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>
		<artifactId>demo</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>
	<groupId>com.test.app</groupId>
	<artifactId>webapp</artifactId>
	<packaging>war</packaging>
	<version>1.0-SNAPSHOT</version>
	<name>webapp Maven Webapp</name>
	<url>http://maven.apache.org</url>

	 <build>
		<finalName>webapp</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		<!--
			<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>tomcat-maven-plugin</artifactId>
                <configuration>
                    <url>http://127.0.0.1:9001/manager</url>
                    <server>test</server>
                    <path>/</path>
                </configuration>
            </plugin>
         -->
		</plugins>
	</build>

	<dependencies>

		<dependency>
			<groupId>com.test.app</groupId>
			<artifactId>app</artifactId>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>

	</dependencies>

</project>

不禁发现,当app项目添加了一个项目依赖和webapp一点关系都没有,因为maven有依赖传递的功能,不过要注意冲突就好了.
外面总文件的配置;
<?xml version="1.0" encoding="UTF-8"?>
<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>demo</artifactId>
     <packaging>pom</packaging>
     <version>1.0.0-SNAPSHOT</version>
     <name>CE Maven Demo</name>
     
     <modules>
         <module>app</module>
         <module>webapp</module>
   			 <module>util</module>
     </modules>

     
   <dependencyManagement>
		<!--webx-3.0 related-->
		  <dependencies>
		  <dependency>
				<groupId>com.test.util</groupId>
			  <artifactId>util</artifactId>
			  <version>1.0-SNAPSHOT</version>
			</dependency>
			
			<dependency>
				<groupId>com.test.app</groupId>
		    <artifactId>app</artifactId>
		    <version>1.0-SNAPSHOT</version>
			</dependency>
			
			<dependency>
				<groupId>com.test.app</groupId>
		    <artifactId>webapp</artifactId>
		    <version>1.0-SNAPSHOT</version>
			</dependency>

			
		 <dependency>
         <groupId>javax.servlet</groupId>
         <artifactId>servlet-api</artifactId>
         <version>2.4</version> 
         <scope>provided</scope>
     </dependency>
     
     <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
			
			</dependencies> 
	</dependencyManagement>  
 </project>


这种管理方式真的是very perfect,从版本,依赖,打包,构建等等都非常的到位
分享到:
评论

相关推荐

    Maven入门巨无霸视频教程(2.24G)

    使用Maven核心概念介绍(坐标、依赖、仓库、插件、生命周期等)、Maven与第三方Elicpse整合及如何在Eclipse中使用Maven、什么是私服、Maven为什么使用私服、Maven私服Nexus的安装使用、如何使用Maven构建Web应用、使用...

    尚硅谷_Maven.doc

    本课程将帮助你了解 Maven 的作用,常用命令,如何配置依赖,以及依赖的范围、依赖的传递性、依赖的排除、生命周期等重要概念,以及继承、聚合这样的 Maven 配置。更会手把手教你在 Eclipse 中玩转 Maven。

    尚硅谷Java视频教程_Maven视频

    · 01....依赖的传递性 · 28.依赖的排除 · 29.依赖的原则说明 · 30.依赖的原则测试 · 31.统一管理依赖的版本号 · 32.继承 · 33.聚合 · 34.Web工程的自动部署 · 35.查找依赖信息的网站

    maven window下安装包

    第5章:坐标和依赖/5.6 传递性依赖 第5章:坐标和依赖/5.7 依赖调解 第5章:坐标和依赖/5.8 可选依赖 第5章:坐标和依赖/5.9 最佳实践/5.9.1 排除依赖 第5章:坐标和依赖/5.9 最佳实践/5.9.2 依赖属性使用变量 第5章...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven依赖管理 (Dependency Management) 3.5.6. 站点生成和报告 (Site Generation and Reporting) 3.6. 小结 4. 定制一个Maven项目 4.1. 介绍 4.1.1. 下载本章样例 4.2. 定义Simple Weather项目 4.2.1...

    Maven2 的新特性.7z

    在Maven2中实现了传递依赖,如此对于Hibernate所依赖的包,Maven2会自动下载,开发人员只需关心Hibernate即可。 注意:只有得到Maven支持的依赖,通常是plugin形式出现,才能获得这个特性。而且对于一些老的plugin,...

    maven-jpackage-template:示例项目,说明在使用本机安装程序的同时仍使用标准Maven依赖系统的情况下,构建基于JavaFX的小型跨平台小型桌面应用程序

    使用标准的Maven依赖系统自动管理普通的JAR依赖(包括传递Maven依赖)。 使用自动生成问题提供不错的小型安装程序的jlink / jpackage工具依赖于新的Java模块系统。 该系统很难使用,因为它期望Java库添加模块信息...

    尚硅谷Maven视频

    本课程将帮助你了解 Maven 的作用,常用命令,如何配置依赖,以及依赖的范围、依赖的传递性、依赖的排除、生命周期等重要概念,以及继承、聚合这样的 Maven 配置。更会手把手教你在 Eclipse 中玩转 Maven。  ·...

    Apache Maven项目构建工具-其他

    由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目,而使用Ant则需要十几行。事实上,由于Maven的面向项目的方法,许多Apache Jakarta项目现在使用Maven,而且公司项目...

    Maven-[removed]用于处理 JavaScript 的 MavenEclipse 设置

    主要目标之一是使用 JavaScript 作为正常的 Maven 依赖项,而无需复制或解压源文件。 cujojs 种子项目用作模板。 特征 基于 Maven 的 JavaScript 依赖管理 传递依赖支持 将 JavaScript 代码与 Web 应用程序代码...

    incremental-build-test:使用 maven 和 jenkins 测试增量构建的示例项目

    构建了传递依赖模块 使测试用例失败,然后修改没有依赖模块的不相关模块 破坏测试用例后,构建不稳定(修改+依赖模块构建) 修改一个不相关的模块后,损坏的模块及其依赖模块会再次重建 不同的依赖范围 已构建修改...

    Maven指南阅读笔记

    构建的groupId和artifactId已经更改了,而当前的项目需要一个与传递性 依赖不同名称的版本——结果是classpath中出现了同样项目的两份内容。 一般来说Maven会捕捉到这种冲突并且使用该项目的一个单独的版本,但是 当...

    Maven完全手册

    在Maven2中有了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。 6. 新增Dependency Scope 这点也比较重要,有些用于test范围的包,可以不用加入依赖了 7. 传递依赖,简化依赖管理 这...

    java班级管理源码-MavenIn28Minutes:Maven初学者教程和示例

    步我们将学习依赖管理和传递依赖 第 7 步我们将了解一个具有多层的 maven 项目。 典型的项目有 web 层、数据层、外部接口层。 我们将学习如何使用 maven 创建这样的项目。 多模块 Maven 项目。 第 8 步:我们将学习...

    dependency-graph-plugin-m-3.x.x:Maven版本> 3.1的依赖图Maven插件。 使用GEXF和GRAPML文件格式生成依赖关系图

    dependencygraph:graph构建包含Maven项目的依赖关系图的GEXF文件 可选参数 范围 类型 描述 及物 布尔值 依赖项遍历的类型(是否传递)。 默认值为:true 独立图形 细绳 为每个Maven模块创建单独的依赖关系图。 ...

    SpringCloud入门.docx

    3.依赖传递:依赖具有传递性,在不同模块重复依赖会有覆盖现象。 4.可选依赖:在依赖下使用option标签,标签的内容为true或者false。如果为true则向需要该模块的模块进行隐藏。此时该模块需要手动依赖所需模块。即...

    GradleUser Guide.pdf

    Gradle 提供了: 一个像 Ant 一样的非常灵活的通用构建工具 一种可切换的, 像 maven 一样的基于合约构建的框架 支持强大的多工程构建 支持强大的依赖管理(基于 ApacheIvy ) 支持已有的 maven 和 ivy 仓库 支持传递性...

    MavenDemo:Android使用Nexus搭建 Maven私有仓库

      Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。  Android...

    Java全栈工程师-Maven基础

    本课程讲解Maven的项目构建、依赖传递、依赖冲突等本课程讲解Maven入门基础知识

Global site tag (gtag.js) - Google Analytics