Maven(基础)

参考文章

个人笔记,不同意见,望有交流
直接可以点击跳转连接

作者 菜鸟教程
作者:JavaEdge :maven clean/install/build/package命令行详解

Maven官网

尚硅谷:


一、Maven

官网

如今我们构建一个项目需要用到很多第三方的类库,如写一个使用Spring的Web项目就需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌,并且Jar包之间的关系错综复杂,一个Jar包往往又会引用其他Jar包,缺少任何一个Jar包都会导致项目编译失败。

以往开发项目时,程序员往往需要花较多的精力在引用Jar包搭建项目环境上,而这一项工作尤为艰难,少一个Jar包、多一个Jar包往往会报一些让人摸不着头脑的异常。

而Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。

1、Maven是什么

Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型 (POM) 的概念,Maven
可以从一条中心信息管理项目的构建、报告和文档。

Maven 是意第绪语,意思 是知识的积累者,最初是为了简化 Jakarta Turbine 项目中的构建过程。有几个项目,每个项目都有自己的 Ant 构建文件,它们都略有不同。JAR 被检入 CVS。我们想要一种标准的方式来构建项目,清楚地定义项目的组成,发布项目信息的简单方法,以及在多个项目之间共享 JAR 的方法。
现在可以用于构建和管理任何基于 Java 的项目的工具。我们希望我们已经创建了一些东西,可以让 Java 开发人员的日常工作更轻松,并且通常有助于理解任何基于 Java 的项目。
Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。

2、特征(官网的)

  1. 遵循最佳实践的简单项目设置 - 在几秒钟内启动新项目或模块
    (就是搭建项目模块都挺快)

  2. 所有项目的一致使用 - 意味着新开发人员进入项目没有加速时间
    (可以在项目中规定统一pomjar包版本,这样开发有利于版本统一)

  3. 高级依赖管理,包括自动更新、依赖关闭(也称为传递依赖)
    (依赖的自定义,可以设置自动加载,更新依赖,等)
    在这里插入图片描述

  4. 能够轻松地同时处理多个项目
    (字面意思)

  5. 一个庞大且不断增长的库和元数据存储库,开箱即用,并与最大的开源项目安排到位,以实时提供最新版本
    (就是说他的jar包中央仓库)

  6. 可扩展,能够轻松地用Java 或脚本语言编写插件
    (可以轻松的通过一定的自定义方式满足工作上的要求)

  7. 只需很少或无需额外配置即可即时访问新功能

  8. 在 Maven 之外进行依赖管理和部署的 Ant 任务
    作者 :雨临Lewis:Maven和Ant简介以及两者的区别

  9. 基于模型的构建:Maven 能够将任意数量的项目构建为预定义的输出类型,例如 JAR、WAR 或基于项目元数据的分发,而在大多数情况下无需编写任何脚本。
    (大概的意思就是打成什么包)

  10. 项目信息的一致站点:使用与构建过程相同的元数据,Maven 能够生成一个网站或 PDF,包括您想要添加的任何文档,并添加到该标准报告中关于项目的开发状态。此信息的示例可以在本网站左侧导航底部的“项目信息”和“项目报告”子菜单下查看。

  11. 发布管理和分发发布:无需太多额外配置,Maven 将与您的源代码控制系统(如 Subversion 或 Git)集成,并根据某个标签管理项目的发布。它还可以将其发布到分发位置以供其他项目使用。Maven 能够发布单独的输出,例如 JAR、包含其他依赖项和文档的存档,或作为源分发。

  12. 依赖管理:Maven 鼓励使用 JAR 和其他依赖的中央存储库。Maven 带有一种机制,项目的客户可以使用该机制从中央 JAR 存储库下载构建项目所需的任何 JAR,这与 Perl 的 CPAN 非常相似。这允许 Maven 的用户跨项目重用 JAR,并鼓励项目之间的通信以确保处理向后兼容性问题。

二、安装

Maven是基于java的,所以jdk必须先安装,不同版本要求的不同,8.0就行
官网下载

2.1、下载

在这里插入图片描述
一般使用windows直接下载解压到你的文件夹内就行

2.2、配置

  1. 先 配环境变量 这和其他的差不多
    MAVEN_HOME 加 绝对路劲
    在这里插入图片描述
    path添加 %MAVEN_HOME%\bin
    在这里插入图片描述
    检查是否成功
    在这里插入图片描述
  2. idea配置Maven
    设置的build Execution deployment里面的Maven
    设置你的Maven的位置 本地厂库 设置文件 ,这个本地路劲会根据settings走 在这里插入图片描述
  3. 对了,还有一般情况大家都把中央仓库还是配上阿里的中央仓库吧
  4. 修改setting文件:conf\Setting

添加阿里巴巴镜像文件

<mirror> 
<id>aliyun-maven</id> 
<mirrorOf>central</mirrorOf> 
<name>aliyun maven mirror</name> 
<url>https://maven.aliyun.com/repository/central</url>
 </mirror>

修改本地厂库位置
有默认的,但是建议自定义
在这里插入图片描述
修改maven默认为jdk1.8

	<profile>
	  <id>jdk-1.8</id>
	  <activation>
		<activeByDefault>true</activeByDefault>
		<jdk>1.8</jdk>
	  </activation>
	  <properties>
		<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>

三、Maven的文件目录

3.1. Maven规定的程序目录结构

Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。
在这里插入图片描述

Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。

目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。

3.2. Maven软件的文件目录

3.3. 坐标和仓库中 jar 包的存储路径之间的对应关系

在这里插入图片描述

四、创建一个Maven项目(超级简单)

在idea中直接 new -》 project-》 Maven

我们一般会去选择一个模板去创建Maven项目,这样更方便

这个是Maven官网的文档里面说明了这些原型模板
在这里插入图片描述

Archetype ArtifactIdsDescription
maven-archetype-archetype用于生成示例原型项目的原型。
maven-archetype-j2ee-simple用于生成简化示例 J2EE 应用程序的原型。
maven-archetype-mojo用于生成示例 Maven 插件示例的原型。
maven-archetype-plugin用于生成示例 Maven 插件的原型。
maven-archetype-plugin-site用于生成示例 Maven 插件站点的原型。
maven-archetype-portlet用于生成示例 JSR-268 Portlet 的原型。
maven-archetype-quickstart用于生成示例 Maven 项目的原型。
maven-archetype-simple用于生成简单 Maven 项目的原型。
maven-archetype-site用于生成示例 Maven 站点的原型,该站点演示了一些受支持的文档类型,例如 APT、XDoc 和 FML,并演示了如何创建您的站点。
maven-archetype-site-simple用于生成示例 Maven 站点的原型。
maven-archetype-webapp用于生成示例 Maven Webapp 项目的原型。

五、常用命令

在这里插入图片描述

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

构建命令

运行 Maven 中和构建操作相关的命令时,必须进入到 pom.xml 所在的目录。如果没有在 pom.xml 所在的目录运行 Maven的构建命令,那么会看到下面的错误信息:

The goal you specified requires a project to execute but there is no POM in this directory

TIP

mvn -v 命令和构建操作无关,只要正确配置了 PATH,在任何目录下执行都可以。
而构建相关的命令要在 pom.xml 所在目录下运行——操作哪个工程,就进入这个工程的 pom.xml 目录。

2、清理操作 mvn clean

mvn clean

效果:删除 target 目录

3、编译操作mvn compile test-compile

主程序编译:mvn compile

  • 错误记录:mvn全局命令突然不能用了,解决方式是,在path环境变量中吧MAVEN_HOME移动到java_home后面了
    在这里插入图片描述

编译 成功截图
在这里插入图片描述
在这里插入图片描述
主体程序编译结果存放的目录:target/classes

测试程序编译:mvn test-compile

编译 成功截图生成测试代码
在这里插入图片描述

测试程序编译结果存放的目录:target/test-classes

4、测试操作 mvn test

mvn test

测试的报告存放的目录:target/surefire-reports

5、打包操作 mvn package

mvn package

打包的结果——jar 包,存放的目录:target

6、安装操作 mvn install

mvn install

[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\target\pro01-maven-java-1.0-SNAPSHOT.jar to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
[INFO] Installing D:\maven-workspace\space201026\pro01-maven-java\pom.xml to D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.pom

安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。

坐标信息如下:

com.atguigu.maven
pro01-maven-java
1.0-SNAPSHOT
在 Maven 仓库中生成的路径如下:

D:\maven-rep1026\com\atguigu\maven\pro01-maven-java\1.0-SNAPSHOT\pro01-maven-java-1.0-SNAPSHOT.jar
另外,安装操作还会将 pom.xml 文件转换为 XXX.pom 文件一起存入本地仓库。所以我们在 Maven 的本地仓库中想看一个 jar 包原始的 pom.xml 文件时,查看对应 XXX.pom 文件即可,它们是名字发生了改变,本质上是同一个文件。
在这里插入图片描述

六、Maven的命令使用和一些操作

  1. 运行mvn archetype:generate开始创建
6.1创建web工程 mvn archetype:generate

在学习尚硅谷web工程的时候离谱的报了一个druid这个类找不到错误,真的离谱,这个时候你需要把这个jar包放到你的Tomcat的lib包里面就行了

在这里插入图片描述
创建

 mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
-- 输入id
Define value for property 'groupId': com.atguigu.maven
-- 名称
Define value for property 'artifactId': pro02-maven-web
-- 版本
Define value for property 'version' 1.0-SNAPSHOT: :【直接回车,使用默认值】

Define value for property 'package' com.atguigu.maven: :【直接回车,使用默认值】
-- 
Confirm properties configuration: groupId: com.atguigu.maven artifactId: pro02-maven-web version: 1.0-SNAPSHOT package: com.atguigu.maven Y: :【直接回车,表示确认】

打包 mvn package
部署 放到Tomact的wabapps目录 然后运行Tomact就行了
6.2、Web工程依赖java工程
导入java工程的坐标
<!-- 配置对Java工程pro01-maven-java的依赖 -->
<!-- 具体的配置方式:在dependency标签内使用坐标实现依赖 -->
<dependency>
	<groupId>com.atguigu.maven</groupId>
	<artifactId>pro01-maven-java</artifactId>
	<version>1.0-SNAPSHOT</version>
</dependency>
打包 mvn package

查看lib中的是否有导入的包
在这里插入图片描述

查看工程依赖 mvn dependency:list

在这里插入图片描述

groupId:artifactId:打包方式:version:依赖的范围

在这里插入图片描述

以树形结构查看工程依赖 mvn dependency:tree

在这里插入图片描述

6.3 jar包的依赖范围scope标签

compile | test | provided | system | runtime | import

编译

测试

规定(服务器已经部署的jar包不参与部署)

系统依赖 ( )

运行(只对测试和运行的classpath有效)
,该依赖与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>

导入依赖
该依赖范围只能与dependencyManagement元素配合使用,其功能为将目标pom文件中dependencyManagement的配置导入合并到当前pom的dependencyManagement中。

6.4 jar包的依赖传递

在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

  • B 依赖 C 时使用 compile 范围:可以传递
  • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。
6.5 依赖排除

当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉。而往往这种情况都是为了避免 jar 包之间的冲突。
在这里插入图片描述

<dependency>
	<groupId>com.atguigu.maven</groupId>
	<artifactId>pro01-maven-java</artifactId>
	<version>1.0-SNAPSHOT</version>
  <scope>compile</scope>
  <!-- 使用excludes标签配置依赖的排除	-->
	<exclusions>
		<!-- 在exclude标签中配置一个具体的排除 -->
		<exclusion>
			<!-- 指定要排除的依赖的坐标(不需要写version) -->
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>

七、生命周期等东西

验证 编译 测试(可选) 打包 检查 安装 部署

为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作

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

7.2、Maven 中的聚合

和继承类似原理

聚合可以让你一键执行 Maven 命令 很多构建命令都可以在“总工程”中一键执行。

以 mvn install 命令为例:Maven 要求有父工程时先安装父工程;有依赖的工程时,先安装被依赖的工程。我们自己考虑这些规则会很麻烦。但是工程聚合之后,在总工程执行 mvn install 可以一键完成安装,而且会自动按照正确的顺序执行。

配置聚合之后,各个模块工程会在总工程中展示一个列表,让项目中的各个模块一目了然

不要出现依赖循环

A 工程依赖 B 工程,B 工程依赖 C 工程,C 工程又反过来依赖 A 工程,那么在执行构建操作时会报下面的错误:

DANGER
[ERROR] [ERROR] The projects in the reactor contain a cyclic reference:

7.3 插件

Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由
maven-compiler-plugin-3.1.jar 插件来执行的。
在这里插入图片描述
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。

Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和
test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。

简单的来说具体的功能都是有一些jar包提供的,而一个jar包可能对应多个功能

7.4、仓库的概念
  1. 本地仓库

  2. 远程仓库
    局域网:我们自己搭建的 Maven 私服,例如使用 Nexus 技术。
    中央仓库
    镜像仓库:内容和中央仓库保持一致,但是能够分担中央仓库的负载,同时让用户能够就近访问提高下载速度,例如:Nexus aliyun

八、pom.xml(Maven核心)

POM======Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现

8.1、基础生成的pom

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <!--项目坐标信息-->
    <groupId>com.bbb</groupId><!--公司组织项目-->
    <artifactId>ssm_swagger_20220804</artifactId><!--模块-->
    <version>1.0-SNAPSHOT</version><!-- 版本-->
    <!-- 当前Maven工程的打包方式,可选值有下面三种: -->
    <!-- jar:表示这个工程是一个Java工程  -->
    <!-- war:表示这个工程是一个Web工程 -->
    <!-- pom:表示这个工程是“管理其他工程”的工程 -->
    <packaging>war</packaging>

            <!--定义属性值-->
    <properties>
        <!-- 工程构建过程中读取源码时使用的字符集 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <!-- 当前工程所依赖的jar包 -->
    <dependencies>
        <!-- 使用dependency配置一个具体的依赖 -->
        <dependency>
            <!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- scope标签配置依赖的范围 -->
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

九、父子项目(继承)

Maven工程之间,A 工程继承 B 工程 。
就是pom配置继承。

作用

管理依赖信息的版本。

大型项目的模块拆分。
不同模块都需要配置自己的依赖信息

  • 在每一个 module 中各自维护各自的依赖信息很容易发生出入,不易统一管理。
  • 使用同一个框架内的不同 jar 包,它们应该是同一个版本,所以整个项目中使用的框架版本需要统一。
  • 使用框架时所需要的 jar 包组合(或者说依赖信息组合)需要经过长期摸索和反复调试,最终确定一个可用组合。这个耗费很大精力总结出来的方案不应该在新的项目中重新摸索。
具体操作
命令操作
  1. 创建父工程
    修改pom
 <groupId>com.atguigu.maven</groupId>
  <artifactId>pro03-maven-parent</artifactId>
  <version>1.0-SNAPSHOT</version>

  <!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
  <packaging>pom</packaging>
  1. 在父工程下面创建子模块在这里插入图片描述在这里插入图片描述在这里插入图片描述

  2. 管理依赖
    在这里插入图片描述

  <!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。	-->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。
如果你自己配置了version 那子过程就会覆盖父工程的,采纳子过程的内容
 -->

  <dependencies>
  	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
	</dependency>
<dependencies>
  1. 声明自定义属性
<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	
	<!-- 自定义标签,维护Spring版本数据 -->
	<atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>
  	<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>spring-core</artifactId>
				<version>${atguigu.spring.version}</version>
			</dependency>
IDEA操作
  1. 创建一个Maven父工程在这里插入图片描述
  2. 创建子工程在这里插入图片描述在这里插入图片描述
  3. pom.xml的变化
父中的变化
 <groupId>com.atguigu</groupId>
    <artifactId>pro07-maven-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>pro08-maven-parent</module>
    </modules>
子中多了一个parent
 <parent>
        <artifactId>pro07-maven-parent</artifactId>
        <groupId>com.atguigu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

十、IDEA使用Maven

10.1. 指定Maven

在这里插入图片描述
IDEA 会根据我们在这里指定的 Maven 家目录自动识别到我们在 settings.xml 配置文件中指定的本地仓库。每次创建 Project 后都需要设置 Maven 家目录位置,否则 IDEA 将使用内置的 Maven 核心程序(不稳定)并使用默认的本地仓库位置。(一般设置一次就可以了,但是有的时候又脑抽过默认的了)

10.2. 使用Maven命令

命令可以很复杂,本人不太会
比如

# -D 表示后面要附加命令的参数,字母 D 和后面的参数是紧挨着的,中间没有任何其它字符
# maven.test.skip=true 表示在执行命令的过程中跳过测试
mvn clean install -Dmaven.test.skip=true

在这里插入图片描述
注意命令的作用范围
在这里插入图片描述

10.3. 拉取其他模块到这个工程(导入模块)

目前我们通常使用的都是 Git(本地库) + 码云(远程库)的版本控制系统,结合 IDEA 的相关操作方式

导入整个工程比较容易直接把包拿过来,重新配置一下maven仓库就行

导入一个单独的模块的时候就麻烦一点了
在这里插入图片描述
选择导入的模块,在选择导入的方式,web模块注意web。xml文件目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Network porter

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

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

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

打赏作者

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

抵扣说明:

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

余额充值