三个模块
为了说明问题,以用户登陆小web应用为例。通常一个web应用分为三个模块,模型和数据持久化层user-core, 业务逻辑层user-service以及web展现层user-web,
user-service依赖于user-core
user-web依赖于user-core和user-service
依赖作用范围
Maven的dependency定义了scope元素,用于控制依赖的部署
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
1.compile
编译范围,默认scope,在工程环境的classpath(编译环境)和打包(如果是WAR包,会包含在WAR包中)时候都有效。
compile表示依赖在编译的时候加载,编译,测试和打包都有效
2.provided
提供范围,表示该依赖包已经由目标容器(如tomcat)和JDK提供,只在编译和测试的classpath中加载和使用,打包的时候不会包含在目标包中。
最常见的是j2ee规范相关的servlet-api和jsp-api等jar 包,一般由servlet容器提供,无需在打包到war 包中,如果不配置为provided,把这些包打包到工程war包中,在tomcat6以上版本会出现冲突无法正常运行程序(版本不符的情况)
打包的时候无效,编译和测试的时候有效
3.runtime
一般是运行和测试环境使用,编译时候不用加入classpath,打包时候会打包到目标包中。一般是通过动态加载或接口反射加载的情况比较多。也 就是说程序只使用了接口,具体的时候可能有多个,运行时通 过配置文件或jar包扫描动态加载的情况。典型的包括:JDBC驱动等。
编译时无效,测试和打包的时候有效
4.test
测试范围,一般是单元测试场景使用,在编译环境加入classpath,但编译mvn compile, 打包mvn package不会加入,如junit,dbunit等。
只有在编译src/test目录下的类是才会使用scope为test的依赖
编译和打包无效,测试有效
5.system
系统范围,与provided类似,只是标记为该scope的依赖包需要明确指定基于文件系统的jar包路径。因为需要通过systemPath 指定本地jar文件路径,所以该scope是不推荐的。如果是基于组织的,一般会建立本地镜像,会把本地的或组织的基础组件加入本地镜像管理,避过使用该 scope的情况。
6.import
依赖传递
当在user-service模块的pom.xml文件中添加了对user-core的依赖后,Maven自动将user-core这个模块的pom.xml中声明的依赖加入到user-core的classpath上。注意:添加的依赖只是在user-core中scope声明为compile范围的,其他的范围例如test,则不会进行依赖传递
传递依赖版本的选择(Case1)
假如有三个模块A,B和C,以及另一个模块X,例如junit
A依赖于junit的3.8.2版本,B依赖于junit的4.11版本,同时A和B对junit的依赖scope都是compile而不是test(这里仅仅用于说明问题,不必拘泥于这种对junit设置为compile的情况不存在)
这种情况常见,比如X模块是log4j,很多模块都会依赖于log4j
那么当C依赖于A和B时,A和B依赖的junit都要传递给C,那么最终传递给C的junit究竟是哪个版本?答案是,在C的pom.xml中,如果C直接添加了对X的依赖,那么无视A,B传递过来的X;如果C没有添加对X
的直接依赖,那么A和B依赖的junit都要传递给C,那么最终传递给C的junit究竟是哪个版本?答案是,在C的pom.xml中,先声明对哪个模块依赖,就取那个模块传递的依赖,因此C依赖的junit版本是A传递过来的3.8.2,而不是自作聪明的取B依赖的更高版本4.11
C->A->X
C->B->X
相关推荐
**Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程。Maven通过使用一个项目对象模型(Project Object Model,POM),XML格式的配置文件,定义了...
**Maven学习笔记** 在Java开发领域,Maven是一个不可或缺的构建工具,它极大地简化了项目的构建、管理和依赖管理过程...这份"Maven学习笔记"将是你探索Maven世界的宝贵资源,涵盖了从基本概念到高级特性的全方位知识。
** Maven基础入门 ** Maven是一个Java项目管理工具,它主要负责构建、依赖管理和项目信息管理。...在`maven_study_01`的学习笔记中,你可以找到更多关于Maven的基础知识和实践案例,帮助你快速上手并掌握这一工具。
Maven依赖管理的关键在于它的中央仓库,存储了大量的开源库,开发者无需手动下载即可直接引用。此外,还可以设置本地仓库和私有远程仓库,以满足特定项目的需求。Maven通过解析POM文件中的依赖声明,自动从仓库中...
** Maven学习笔记详解 ** Maven,作为Java项目管理和构建工具,是开发人员不可或缺的利器。它通过使用一种标准化的项目对象模型(Project Object Model,POM)来管理项目的依赖关系,构建过程以及配置信息。Maven...
在“培训机构传出的maven学习笔记”中,我们可能涵盖以下几个关键知识点: 1. **Maven的基本概念**:理解Maven的核心概念,如POM.xml文件、仓库(本地仓库和中央仓库)、生命周期和构建阶段(如clean、compile、...
**Maven教程:基础篇——尚硅谷学习笔记 2022年** Maven是一个强大的Java项目管理和构建工具,由Apache软件基金会开发。它通过提供一个标准的项目对象模型(Project Object Model,POM)来简化项目的构建过程,并...
【mybatis_maven学习笔记】 在Java开发领域,MyBatis和Maven是两个不可或缺的工具,它们分别在数据访问层和项目构建方面扮演着重要角色。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射,...
【Maven学习笔记1】 Maven是一个强大的Java项目管理和构建工具,它可以帮助开发者管理项目的依赖、构建过程、项目信息和报告。本笔记主要涵盖了Maven的基础知识,包括资料收集、安装指南,特别是针对Linux环境下的...
内容概要:maven学习笔记,适合刚接触maven的人能让你快速入门。 适用人群:大学生或者初基础maven的人 使用场景及目标:idea集成maven,用来下载依赖包
### 个人Maven学习笔记 #### 为什么使用Maven? 在软件开发过程中,尤其是在使用Java进行后端开发时,项目通常会依赖大量的第三方库或框架。如果没有统一的管理工具,这些依赖很容易出现版本冲突的问题,增加了...
**Maven学习笔记** Maven是一个强大的Java项目管理和构建工具,它简化了项目的构建、依赖管理和文档生成。本文档基于尚硅谷的视频教程,旨在帮助读者深入理解Maven的核心概念和使用方法。 **1. 为什么学习Maven** ...
【Maven学习笔记】 Maven是一个强大的项目管理和构建工具,主要应用于Java开发领域。它能够自动管理项目的依赖关系,帮助开发者解决因jar包版本冲突、依赖管理混乱等问题带来的困扰。Maven通过制定一套规范化的项目...
**Maven项目学习笔记记录** 在软件开发领域,Maven是一个强大的项目管理和构建工具,尤其在Java开发中广泛使用。本笔记将深入探讨Maven的核心概念、主要功能以及实际应用场景,帮助你更好地理解和掌握这一重要工具...
【标题】"201205_Maven学习笔记3.rar"所涵盖的知识点主要集中在Maven的使用和集成上,这是一个关于Maven的详细学习资料压缩包,包含多个文档,帮助用户理解并掌握Maven在实际开发中的应用。Maven是一个强大的Java...
这本书通过一系列逐步讲解的实例,模拟了开发者之间互相学习、交流的过程,让读者能够快速上手并精通Maven。 Maven的核心概念包括项目对象模型(Project Object Model,POM),这是Maven处理项目配置的主要方式。...
Maven 是一个强大的项目管理和构建工具,主要针对Java项目,由Apache公司开发。它基于项目对象模型(Project Object Model,POM),通过POM文件来管理项目的构建...因此,学习和掌握Maven是现代Java开发者的必备技能。