1.首先了解什么是maven

 

1.1 Maven的概念:

Maven这个单词来自于意第绪语,意为知识的积累,最早在Jakata Turbine项目中它开始被用来试图简化构建项目过程。

Maven是一个项目管理工具,它包含一个项目对象模型(project Object Model),一组标准集合,一个项目生命周期(project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在声明周期阶段(phase)中的插件(plugin)目标(goal)的逻辑。

 

几个概念:

  1. POM 项目对象模型(规范,xml文件-管理maven项目)
  2. 标准集合(标准的规范约定)-骨架
  3. 项目(工程)生命周期—从开发角度来说
  4. 依赖管理系统 (开发项目工程需要依赖其他的项目--jar)
  5. 插件(maven的具体功能,是靠插件完成)(本身核心很小—想用它,需要用一些依赖的东东)

 

1.2 Maven的核心思想:

            约定由于配置的思想

每个公司都有自己的开发规范(打包规范、编译环境),这其实就是一种约定。

使用maven进行项目管理,很多环节内容是约定好的。可以更好的敏捷开发。

 

1.3 maven的作用:

Maven 是面向技术层面,针对java开发项目管理工具,他提供了构建工具所提供功能的超集,除了构建功能之外,Maven还可以管理项目结构、管理依赖关系、生成报告、生成Web站点、有助于团队成员之间的交流与协作。

 

1.4 Maven管理项目的周期:

java maven依赖是什么意思 maven 依赖范围说明_Maven

 

2 Maven中依赖范围概念

maven 项目不同的阶段引入到classpath中的依赖是不同的,这个紧密结合Maven生命周期。具体而言:依赖范围就是用来控制依赖于classpath的关系。依赖范围可选:compile、test、provided、runtime、system、import,后面将会介绍。

 

2.1 依赖范围在pom.xml中如何体现:可以用scope标签,设置依赖范围

 

scope标签就是依赖范围的配置,默认是compile,可选配置有test、provided、runtime、system、import

pom文件如下配置:

    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.7</version>

   <scope>test</scope>
    </dependency>

java maven依赖是什么意思 maven 依赖范围说明_ide_02

 

2.3 依赖范围详解:

 

依赖主要是以下五种:

  • compile
    默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布。
  • provided
    跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。
  • runtime
    表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。
  • test
    表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system
    跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它。

(1)编译依赖范围(compile):默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段(编译、测试、运行三种classpath都有效),会随着项目一起发布。举个简单的例子,假如项目中有spring-core的依赖,那么spring-core不管是在编译,测试,还是运行都会被用到,因此spring-core必须是编译范围(构件默认的是编译范围,所以依赖范围是编译范围的无须显示指定)

 

(2)测试依赖范围(test):只对测试classpath有效,在编译主代码和项目运行时,都将无法使用该依赖,最典型的例子就是 Junit, 构件在测试时才需要,所以它的依赖范围是测试,因此它的依赖范围需要显示指定为<scope>test</scope> ,当然不显示指定依赖范围也不会报错,但是该依赖会被加入到编译和运行的classpath中,造成不必要的浪费 。

 

(3)已提供依赖范围(provided):只对编译和测试的classpath有效,对运行的classpath无效,典型的例子就是servlet-api, 编译和测试该项目的时候需要该依赖,但是在运行时,web容器已经提供的该依赖,所以运行时就不再需要此依赖,如果不显示指定该依赖范围,并且容器依赖的版本和maven依赖的版本不一致的话,可能会引起版本冲突,造成不良影响。

 

(4)运行时依赖范围(runtime):只对测试和运行的classpath有效,对编译的classpath无效,典型例子就是JDBC的驱动实现,项目主代码编译的时候只需要JDK提供的JDBC接口,只有在测试和运行的时候才需要实现上述接口的具体JDBC驱动。

(5)系统依赖范围(system):该依赖与classpath的关系与 provided依赖范围完全一致,但是系统依赖范围必须通过配置systemPath元素来显示指定依赖文件的路径,此类依赖不是由maven仓库解析的,而且往往与本机系统绑定,可能造成构件的不可移植,因此谨慎使用,systemPath元素可以引用环境变量:

        <dependency>
    <groupId>javax.sql</groupId>
    <artifactId>jdbc-stext</artifactId>
    <version>2.0</version>
    <scope>system</scope>
    <systemPath>${java.home}/lib/rt.jar</systemPath>
    </dependency>

(6)导入依赖范围(import):该依赖范围不会对三种classpath产生影响,该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。有关dependencyManagement的功能请了解maven继承特性。

 

3 拓展:获取jar包和配置:

通过https://mvnrepository.com/  进入获取jar包。

java maven依赖是什么意思 maven 依赖范围说明_ide_03

 

访问,从搜索栏中查询需要的jar包,点击进去复制代码即可。但要注意需要配置maven-config-settings.xml如下:

 

java maven依赖是什么意思 maven 依赖范围说明_Maven_04