pom.xml文件
就像 Make 的 MakeFile、Ant 的 build.xml 一样,Maven 项目的核心是 pom.xml。POM(全称 Project Object Model,项目对象模型 ) 定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
Gredele------->比maven更简单的产品,如mybatis框架,ssm框架,spring框架等等,管理方式都是gredele
坐标
坐标的概念
在 Maven 中坐标是构件的唯一标识,Maven 坐标的元素包括 groupId、artifactId、version、packaging、classifier。上述5个元素中,groupId、artifactId、version 是必须定义的,packaging 是可选的 ( 默认为 jar )。
坐标的意义
- Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范
- 拥有了统一规范,就可以把查找工作交给机器
坐标的含义
- groupId:组织标识,一般为:公司网址的反写+项目名
- artifactId:项目名称,一般为:项目名-模块名
- version:版本号 形式为0.0.1-SNAPSHOT:
- 第一个 0 表示大版本号,第二个 0 表示分支版本号,第三个 0 表示小版本号
- SNAPSHOT -- 快照版本,ALPHA -- 内侧版本,BETA -- 公测版本,RELEASE -- 稳定版本,GA -- 正式发布
- packaging:打包的方式,如:pom, jar, maven-plugin, ejb, war, ...
- jar包:一般没有页面,有页面就一定是springboot项目
- pom包:只做依赖管理,不做任何代码实现,也没有代码管理和页面,代码项目由其子模块、子项目等实现
- clissifier:用来帮助定义构件输出的一些附属构件。
示例一:自己的项目的坐标
<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><!--
项目的全球唯一标识符,
通常使用全限定的包名区分该项目和其他项目并且构建时生成的路径也是由此生成,
如cn,tx.maven.生成的相对路径为:/cn/tx/maven
--><groupId>cn.tx.maven</groupId><!--
构件的标识符,它和groupId一起唯一标识一个构件,
也就是说,不能有两个不同的项目拥有同样的artifactId和groupId
--><artifactId>HelloFriend</artifactId><!--
项目当前版本,格式为:主版本.次版本.增量版本-限定版本号
--><version>0.0.1-SNAPSHOT</version><!--
项目产生的构件类型,例如jr、wàr、pom等。
插件可以创建他们自己的构件类型,所以前面列的不是全部构件类型
--><name>HelloFriend</name></project>
示例二:第三方项目的坐标
<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.9</version><scope>test</scope></dependency> <dependency><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency>
</dependencies>
第一个dependency,引入了第三方的依赖包
第二个dependency,引入自己项目的依赖包
依赖
依赖的意义
当编写Java代码时,我们总是需要一些库,例如,做单元测试我们需要JUnit库。对于更大的项目,我们可能需要创建自己的库并在不同的部分使用它的项目。不同的项目需要不同版本的库。 保持项目最新的库JAR文件的正确版本不是一个容易的任务。
每个外部JAR可能还依赖于其他外部JAR文件等。以递归方式下载所有这些外部依赖JAR文件并确保下载正确的版本是一项巨大的任务。
当项目越来越大,我们将需要越来越多的外部依赖。
Maven将下载它们并将它们放在您的本地Maven存储库中。
我们可以在POM文件中的dependencies元素内指定依赖关系。
依赖的使用
例如我们的项目需要进行单元测试,则需要使用到junit-4.9.jar包,使用maven引用该依赖的方式见上文HelloFriend代码
属性说明:
三维坐标:引用依赖包的三维坐标,用来定位该依赖包;
scope: 控制该依赖包在什么情况下会被加到 classpath 中;
classpath有三种代码区(详见下文“依赖范围”):
源代码,测试代码,运行时
第三方依赖的查找方法
我们在不确定所需引用的第三方依赖包的坐标时,通过maven的中央仓库进行查找,网址: https://mvnrepository.com/;
依赖范围
Maven项目在开发工程中有三套classpath
- 主代码:main下面的都是主代码在编译的时候的依赖
- 测试代码:test下是测试代码编译的时候的依赖
- 运行时:main代码在运行的时候对包的依赖
依赖范围的使用,通过在引用第三方依赖时的<scope></scope>标签进行设置,如上文
共 6 种 scope,包括:compile、provided、runtime、test、system、import。例如上图的junit,只在测试中使用,则选择test即可,默认为compile
- Compile:编译依赖范围。默认使用此依赖范围,其下的maven依赖,对于编译,测试,运行classpath都有效。
- Test:测试依赖范围。只对测试classpath有效,编译主代码或运行项目时无法使用此依赖。典型例子如junit。
- Provided:已提供依赖范围。其对于编译与测试classpath有效,运行时无效。如在web开发时,只有在编译和测试时才用到servlet-api,将其设置为此范围,在运行时servlet-api由web容器提供,无须依赖。并且在打war包时,此范围的依赖不会打在WEB-INF/lib下。
- Runtime:运行时依赖范围。与provided相对,运行时classpath有效。典型例子如jdbc(编写是接口规范运行是提供具体实现类需要jar包)
依赖传递和可选依赖
依赖传递
应用场景:
第一直接依赖: HelloFriend项目依赖Hello项目
第二直接依赖: MakeFriend项目依赖HelloFriend项目
解除依赖
例如:当MakeFriend想依赖HelloFriend而不依赖Hello项目时
1、暴力解除依赖
在hellofriend上修改,直接摘除hello,使得hellofriend仍然可以正常依赖hello,但其他依赖hellofriend的项目不会再次携带hello,也就是说hello只为hellofriend服务
2、可选依赖
当出现一个新项目依赖于makefriend时,是否摘除hello可以自主选择
依赖范围对传递依赖的影响
传递依赖是会受到依赖范围的影响的,具体来看结果如下:
依赖阻断
例如在HelloFriend项目里面的Hello依赖处添加<optional>true</optional>
则makeFriend项目里面就不会再引入Hello的依赖
可选依赖
如果我们需要在依赖中明确的排除掉某一依赖,则可以使用exclusion属性,排除掉引用的依赖,如:
<exclusions><!-排除依赖的单体--><exclusion><groupId>cn.tx.maven</groupId><artifactId>Hello</artifactId></exclusion>
</exclusions>