Maven01

IDEA配置Maven请参考文章:https://www.cnblogs.com/zyulike/p/11662471.html

1.什么是maven

目前无论使用 IDEA 还是 Eclipse 等其他 IDE,使用里面 ANT 工具。ANT 工具帮助我们进行编译,打包运行等工作。
Apache 基于 ANT 进行了升级,研发出了全新的自动化构建工具 Maven。(ANT 有的功能 MAVEN 都有,只是使用起来更加方便了)。
Maven 工具基于 POM(Project Object Model,项目对象模型)模式实现的。在 Maven中每个项目都相当于是一个对象,对象(项目)和对象(项目)之间是有关系的。关系包含了:依赖、继承、聚合,实现 Maven 项目可以更加方便的实现导 jar 包、拆分项目等效果。
Maven 是跨平台的,这意味着无论是在 Windows 上,还是在 Linux 或者 Mac 上,都可以使用同样的命令。
Maven 还有一个优点,它能帮助我们标准化构建过程。在 Maven 之前,十个项目可能有十种构建方式。有了 Maven 之后,所有项目的构建命令都是标准化。
Maven 还为全世界的 Java 开发者提供了一个免费的中央仓库,在其中几乎可以找到任何的流行开源类库。
maven的作用
1)Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
2)Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。
3)Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。

2.maven仓库与配置

A.什么是maven仓库
Maven 仓库是基于简单文件系统存储的,集中化管理 Java API 资源(构件——即jar包)的一个服务。仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路径。这得益于 Maven 的坐标机制,任何 Maven 项目使用任何一个构件的方式都是完全相同的,Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
坐标: 坐标有三个部分构成,如果一个部分不同那么表示的就是不同的 jar。
Group Id: 公司名,多用公司网址倒写
Artifact Id: 项目名
Version: 版本
对于 Maven 来说,仓库分为两类:本地仓库和中央仓库。
中央仓库
中央仓库是互联网上的服务器,是 Maven 提供的最大的仓库,里面拥有最全的 jar 包资源。默认是 Maven 自己的网络服务器,但是由于访问速度较慢,我们一般都配置成国内的镜像中央仓库如阿里镜像或者是华为镜像。
本地仓库
本地仓库指用户电脑中的文件夹,该文件夹中包含了自己下载的构件(jar 包)。文件夹结构为 groupid 分级的文件夹/artifactid 文件夹/version 文件夹/包含 jar 包。
B.仓库配置
在 settings.xml 文件中配置本地仓库
本地仓库是开发者本地电脑中的一个目录,用于缓存从远程仓库下载的构件。默认的本地仓库是${user.home}/.m2/repository。用户可使用settings.xml 文件修改本地仓库。具体内容如下
在这里插入图片描述
在 settings.xml 文件中配置镜像仓库
如果仓库 A 可以提供仓库 B 存储的所有内容,那么就可以认为 A 是 B 的一个镜像。例如:在国内直接连接中央仓库下载依赖,由于一些特殊原因下载速度非常慢。这时,我们可以使用阿里云提供的镜像 http://maven.aliyun.com/nexus/content/groups/public/来替换中央仓
库 http://repol.maven.org/maven2/。修改 maven 的 setting.xml 文件,具体内容如下:

<mirror>
<!-- 指定镜像 ID -->
<id>nexus-aliyun</id>
<!-- 匹配中央仓库-->
<mirrorOf>central</mirrorOf>
<!-- 指定镜像名称 -->
<name>Nexus aliyun</name>
<!-- 指定镜像路径 -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

在这里插入图片描述
配置JDK版本

<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
8
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion
>
</properties>
</profile>

3.仓库优先级问题

仓库分为:本地仓库,镜像仓库,中央仓库。
其中镜像仓库=中央仓库。 镜像仓库是用于替代中央仓库的。

仓库访问优先级

第一访问本地仓库
如果本地仓库不存在对应信息,访问配置文件中指定的远程仓库
这个远程仓库是第二优先级。

远程仓库分为镜像仓库和中央仓库
镜像仓库:镜像仓库是 Maven 开发过程中的首选远程仓库,在本地仓库和指定仓库无法获取资源的时候,直接访问镜像仓库。
中央仓库:如果镜像仓库不是中央仓库,则会在访问镜像仓库无法获取资源后,访问中央仓库。

4.Maven工程

Maven 的工程类型
a.POM 工程:POM 工程是逻辑工程。用在父级工程或聚合工程中。用来做 jar 包的版本控制。
b.JAR 工程:将会打包成 jar 用作 jar 包使用。即常见的本地工程 - Java Project。
c.WAR 工程:创建一个 Web Project,在打包时会将项目打成 war 包。

5.创建Maven工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.Maven 项目结构

src 包含了项目所有的源代码和资源文件以及测试代码。
src/main/java 这个目录下储存 java 源代码
src/main/resources 储存主要的资源文件。比如 spring 的 xml 配置文件和 log4j 的properties 文件。
src/test/java 存放测试代码,比如基于 JUNIT 的测试代码一般就放在这个目录下面
target 编译后内容放置的文件夹
pom.xml 是 Maven 的基础配置文件,也是 Maven 项目核心配置文件,用于配置项项目的基本信息,项目的继承关系,项目类型,依赖管理,依赖注入,插件管理,插件注入等等

7.工程关系

[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>

在这里插入图片描述
7.11依赖的传递性
依赖传递性是 Maven2.0 的新特性。假设你的项目依赖于一个 jar 包,而这个 jar 包又依赖于其他 jar 包。你不必自己去找出所有这些依赖,你只需要加上你直接依赖的 jar 包的坐标,Maven 会隐式的把这些 jar 包间接依赖的库也加入到你的项目中。这个特性是靠解析从远程仓库中获取的依赖 jar 包的项目文件实现的。这些项目的所有依赖都会加入到项目中这就是依赖传递性。
如果 A 依赖了 B,那么 C 依赖 A 时会自动把 A 和 B 都导入进来。
创建 A 项目后,选择 IDEA 最右侧 Maven 面板 lifecycle,双击 install 后就会把项目安装到本地仓库中,其他项目就可以通过坐标引用此项目。
spring-Context又依赖于如下四个jar包
在这里插入图片描述
在我们的项目中,导入了spring-context的jar包依赖后,项目同样会导入spring-context所依赖的jar包
在这里插入图片描述
7.12 依赖相同资源的依赖原则
第一原则:最短路径优先原则
“最短路径优先”意味着项目依赖关系树中路径最短的版本会被使用。例如,假设 A、B、C 之间的依赖关系是 A->B->C->D(2.0)和 A->E->(D1.0),那么 D(1.0)会被使用,因为A 通过 E 到 D 的路径更短。
第二原则:最先声明原则
依赖调解第一原则不能解决所有问题,比如这样的依赖关系: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 中依赖声明的顺序决定了谁会被解析使用。顺序最靠前的那个依赖优胜。
7.13排除依赖
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>

以排除spring-context中的aop依赖为例
排除之前的项目依赖为
在这里插入图片描述
在这里插入图片描述
注意:exclusion只能排除导入的jar的依赖,对于单独存在的jar包无法用exclusion排除。
7.14依赖范围
scope 标签属性可取值
在这里插入图片描述
1compile
这是默认范围。如果没有指定,就会使用该依赖范围。表示该依赖在编译和运行时生效。在项目打包时会将该依赖包含进去。
2provided
可以参与编译,测试,运行等周期,但是不会被打包到最终的 artifact 中。典型的例子是 servlet-api,编译和测试项目的时候需要该依赖,但在项目打包的时候,由于容器已经提供,就不需要 Maven 重复地引入一遍(如:servlet-api)
3runtime
runtime 范围表明编译时不需要生效,而只在运行时生效。典型的例子是 JDBC 驱动实现,项目主代码的编译只需要 JDK 提供的 JDBC 接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体 JDBC 驱动。
4system
如果有些你依赖的 jar 包没有 Maven 坐标的,它完全不在 Maven 体系中,这时候你可以把它下载到本地硬盘,然后通过 system 来引用。
不推荐使用 system,因为一个项目的 pom.xml 如果使用了 scope 为 system 的depend 后,会导致传递依赖中断,即所有其他依赖本项目的项目都无法传递依赖了。
5test
test 范围表明使用此依赖范围的依赖,只在编译测试代码和运行测试的时候需要,应用的正常运行不需要此类依赖。典型的例子就是 JUnit,它只有在编译测试代码及运行测试的时候才需要。
7.15依赖管理
Maven 提 供 了 一 个 机 制 来 集 中 管 理 依 赖 信 息 , 叫 做 依 赖 管 理 元 素 ”< dependencyManagement>”。假设你有许多项目继承自同一个公有的父项目,那可以把所有依赖信息放在一个公共的 POM 文件中并且在子 POM 中简单的引用该构件即可。
在这里插入图片描述
< dependencyManagement>标签往往和< properties>标签配合使用,来管理项目依赖的版本号
在这里插入图片描述

[2]继承关系

什么是继承关系?
Maven 中的继承跟 Java 中的继承概念一样,需要有父项目以及子项目。我们可以将项目中的依赖和插件配置提取出来在父项目中集中定义,从而更方便的管理项目的依赖以及插件。注意父项目类型一定为 POM 类型。
继承的优点
1) 依赖或插件的统一管理(在 parent 中定义,需要变更 dependency 版本时,只需要修改一处)。
2) 代码简洁(子 model 只需要指定 groupId,artifactId 即可)。
3) dependencyManagement 是 “ 按 需 引 入 ” , 即 子 model 不 会 继 承 parent 中dependencyManagement 所有预定义的 dependency。

父项目的pom.xml配置如下
在这里插入图片描述
子项目
在这里插入图片描述
注意:子 项目 不 会 继 承 parent 中dependencyManagement 所有预定义的 dependency。(按需引入)

[3]Maven 中的多继承

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

在子项目pom.xml中添加以下内容来继承多个父项目

<dependencyManagement>
	<dependencies>
		<!--父项目 a-->
		<dependency>
			<groupId>com.qt</groupId>
			<artifactId>parent_a</artifactId>
			<version>1.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
		<!--父项目 b-->
		<dependency>
			<groupId>com.qt</groupId>
			<artifactId>parent_b</artifactId>
			<version>1.0-SNAPSHOT</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
[4]聚合关系

Maven 的聚合特性可以帮助我们把多个项目基于多个模块聚合在一起,这样能够更加方便项目的管理。
前提:继承。
聚合包含了继承的特性。
聚合时多个项目的本质还是一个项目。这些项目被一个大的父项目包含。且这时父项目类型为 pom 类型。同时在父项目的 pom.xml 中出现表示包含的所有子模块。
即使在 idea 中,也可以使用聚合在一个窗口创建多个项目。
删除聚合模块步骤
右键模块–> remove module
在这里插入图片描述
右键项目 --> delete
在这里插入图片描述
在父项目中 pom.xml 中中删除模块名
在这里插入图片描述
具体实现方法
B工程中自定义了两个实体类。用B工程生成jar包,在A工程中用Maven导入,并使用B工程这两个类的方法。
在这里插入图片描述
(1)生成B工程的jar包
在这里插入图片描述
在设置的本地仓库路径中可找到相应的jar包
在这里插入图片描述
在这里插入图片描述
把复制的B工程的坐标粘贴到A工程的pom.xml文件中

在工程A中调用工程B的实体类
在这里插入图片描述
B.继承
创建父工程
在这里插入图片描述

在这里插入图片描述
由于父工程是空项目,建议删除SRC目录
在这里插入图片描述
在这里插入图片描述
选择父工程
在这里插入图片描述
在这里插入图片描述
创建完成后,父项目的pom文件中会自动添加一个子项目的标签
在这里插入图片描述
而子项目的pom文件中会自动生成父项目信息
在这里插入图片描述
C聚合
当我们开发的工程拥有 2 个以上模块的时候,每个模块都是一个独立的功能集合。比如某大学系统中拥有搜索平台,学习平台,考试平台等。开发的时候每个平台都可以独立编译,测试,运行。这个时候我们就需要一个聚合工程。
在创建聚合工程的过程中,总的工程必须是一个 POM 工程(Maven Project),各子模块可以是任意类型模块(Maven Module)。所有聚合工程和聚合模块必须处于同一个组(groupId)中,且聚合工程可以嵌套。
创建聚合项目
选择刚刚创建的父项目,以该项目为总工程,鼠标右击–>new–>module
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意子模块路径,路径错误子模块创建失败
在这里插入图片描述
创建完成后,项目结构为
在这里插入图片描述
当然,一个maven工程可以包含多个子模块,每个子模块下也可以创建子模块进行模块间的嵌套。

8.创建war类型项目

在这里插入图片描述
创建好的项目结构如下
在这里插入图片描述
在src下新建一个名叫java的文件夹,右击–>Mark Directory as -->Sources Root
在这里插入图片描述
如果没有src目录,可以点击右侧maven–>项目–>Plugins–>install来尝试解决。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐