Maven(二) Maven POM 模型

一、 在 Idea 中创建 Maven 工程

二、 Maven 项目结构

src 包含了项目所有的源代码和资源文件以及测试代码。

src/main/java 这个目录下储存 java 源代码

src/main/resources 储存主要的资源文件。比如 spring 的 xml 配置文件和 log4j 的properties 文件。

src/test/java 存放测试代码,比如基于 JUNIT 的测试代码一般就放在这个目录下面target 编译后内容放置的文件夹

pom.xml 是 Maven 的基础配置文件,也是 Maven 项目核心配置文件,用于配置项项目的基本信息,项目的继承关系,项目类型,依赖管理,依赖注入,插件管理,插件注入等等

--mavenDemo 项目名
  --.idea 项目的配置,自动生成的,不需要关注。
  --src
    -- main 实际开发内容
       --java 写包和 java 代码,此文件默认只编译.java 文件
       --resource 所有配置文件。最终编译把配置文件放入到 classpath 中。
    -- test
       --java 测试时使用,自己写测试类或 junit 工具等
  pom.xml 整个 maven 项目所有配置内容。


三、 POM 模型

1 依赖关系

Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。

通俗理解:依赖谁就是将谁的 jar 包添加到本项目中。可以依赖中央仓库的 jar,也可以依赖当前开发中其他项目打包后的 jar 包。

在 pom.xml 文件 根元素 project 下的 dependencies 标签中,配置依赖信息,可以包含多个 dependence 元素,以声明多个依赖。每个依赖 dependence 标签都应该包含以下元素:groupId, artifactId, version : 依赖的基本坐标, 对于任何一个依赖来说,基本坐标是最重要的, Maven 根据坐标才能找到需要的依赖。

<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>5.2.4.RELEASE</version>
	</dependency>
</dependencies>

1.1 依赖的传递性

依赖传递性是 Maven2.0 的新特性。假设你的项目依赖于一个 jar 包,而这个 jar 包又依赖于其他 jar 包。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的 jar 包的坐标,Maven 会隐式的把这些 jar 包间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖 jar 包的项目文件实现的。这些项目的所有依赖都会加入到项目中这就是依赖传递性。

如果 A 依赖了 B,那么 C 依赖 A 时会自动把 A 和 B 都导入进来。

创建 A 项目后,选择 IDEA 最右侧 Maven 面板 lifecycle,双击 install 后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。
 

1.2 依赖相同资源的依赖原则

1.2.1 第一原则:最短路径优先原则

“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设 A、B、C 之间的依赖关系是 A->B->C->D(2.0)和 A->E->(D1.0),那么 D(1.0)会被使用,因为A 通过 E 到 D 的路径更短。

1.2.2 第二原则:最先声明原则

依赖调解第一原则不能解决所有问题,比如这样的依赖关系:A–>B–>Y(1.0),A–>C–>Y(2.0),Y(1.0)和 Y(2.0)的依赖路径长度是一样的,都为 2。那么到底谁会被解析使用呢?在 maven2.0.8 及之前的版本中,这是不确定的,但是 maven2.0.9 开始,为了尽可能避免构建的不确定性,maven 定义了依赖调解的第二原则:第一声明者优先。在依赖路径长度相等的前提下,在 POM 中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。

1.3 排除依赖

exclusions: 用来排除传递性依赖 其中可配置多个 exclusion 标签,每个 exclusion 标签里面对应的有 groupId, artifactId 两项基本元素。

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.2.4.RELEASE</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
		</exclusion>
	</exclusions>
</dependency>

1.4 依赖范围

1.4.1scope 属性可取值

1.4.1.1compile

这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时生效。

在项目打包时会将该依赖包含进去。

1.4.1.2provided

可以参与编译,测试,运行等周期,但是不会被打包到最终的 artifact 中。典型的例子是 servlet-api,编译和测试项目的时候需要该依赖,但在项目打包的时候,由于容器已经提供,就不需要 Maven 重复地引入一遍(如:servlet-api)

1.4.1.3runtime

runtime 范围表明编译时不需要生效,而只在运行时生效。典型的例子是 JDBC 驱动实现,项目主代码的编译只需要 JDK 提供的 JDBC 接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体 JDBC 驱动。

1.4.1.4system

如果有些你依赖的 jar 包没有 Maven 坐标的,它完全不在 Maven 体系中,这时候你可以把它下载到本地硬盘,然后通过 system 来引用。

不推荐使用 system,因为一个项目的 pom.xml 如果使用了 scope 为 system 的depend 后,会导致传递依赖中断,即所有其他依赖本项目的项目都无法传递依赖了。

1.4.1.5test

test 范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是 JUnit,它只有在编译测试代码及运行测试的时候才需要。

1.5 依赖管理

Maven 提 供 了 一 个 机 制 来 集 中 管 理 依 赖 信 息 , 叫 做 依 赖 管 理 元 素 ”<dependencyManagement>”。假设你有许多项目继承自同一个公有的父项目,那可以把所有依赖信息放在一个公共的 POM 文件中并且在子 POM 中简单的引用该构件即可。

2 继承关系

2.1 什么是继承关系

Maven 中的继承跟 Java 中的继承概念一样,需要有父项目以及子项目。我们可以将项目中的依赖和插件配置提取出来在父项目中集中定义,从而更方便的管理项目的依赖以及插件。注意父项目类型一定为 POM 类型。

2.2 继承的优点

1) 依赖或插件的统一管理(在 parent 中定义,需要变更 dependency 版本时,只需要修改一处)。

2) 代码简洁(子 model 只需要指定 groupId,artifactId 即可)。

3) dependencyManagement 是“按需引入”,即子 model 不会继承 parent 中dependencyManagement 所有预定义的 dependency。

3 Maven 中的多继承

在 Maven 中对于继承采用的也是单一继承,也就是说一个子项目只能有一个父项目,但是有的时候我们项目可能需要从更多的项目中继承,那么我们可以在子项目中通过添加<dependencyManagement>标记来实现多继承。在子项目的<dependencyManagement>中每个<dependency>标记就一个父工程定义,同时还需要添加<type>标记,值为 pom。添加<scope>标记,值为import。

<dependencyManagement>
	<dependencies>
		<!-- 父项目 a-->
		<dependency>
			<groupId>com.bjsxt</groupId>
			<artifactId>parent_a</artifactId>
			<version>1.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<!-- 父项目 b-->
		<dependency>
			<groupId>com.bjsxt</groupId>
			<artifactId>parent_b</artifactId>
			<version>1.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

4 聚合关系

Maven 的聚合特性可以帮助我们把多个项目基于多个模块聚合在一起,这样能够更加方便项目的管理。

前提:继承。

聚合包含了继承的特性。

聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为 pom 类型。同时在父项目的 pom.xml 中出现<modules>表示包含的所有子模块。

即使在 idea 中,也可以使用聚合在一个窗口创建多个项目。

4.1 删除聚合模块步骤

右键模块--> remove module

右键项目 --> delete

在父项目中 pom.xml 中<modules>中删除模块名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plenilune-望月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值