码迷,mamicode.com
首页 > 其他好文 > 详细

Maven使用介绍

时间:2021-05-04 15:31:58      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:star   provided   ima   yun   针对   sources   修改   下载方式   relative   

一、Maven

1、简介

  Maven是一种流行的服务于Java开发平台的自动化构建工具,对生产环境下多框架、多模块整合开发有重要作用。

2、未使用Maven前存在的问题

(1)一个项目即为一个工程
  问题:未使用Maven前,一个项目就是一个工程。当项目非常大时,用package来划分模块,显得非常臃肿。
  解决:使用Maven可以将一个项目拆分成多个工程(模块)。然后多个工程组成一个完整项目,方便团队分工合作开发。

(2)项目中使用的jar包,需要手动导入
  问题:同样的jar包会重复出现在不同的项目中。既浪费存储空间,也使项目显得臃肿。
  解决:使用Maven可以将jar包放入仓库并进行管理。将jar包放到某个文件夹(仓库)中,当某工程需要使用时,直接“引用“仓库里的jar包,不需要将其复制一份导入工程。

(3)项目所需的jar包,需手动下载
  问题:不同官网提供jar包下载方式不同。使用不同方式下载的jar包可能不一定规范。
  解决:Maven可以解决,将jar包按照固定规则存放在某一个仓库中,可以直接下载规范的jar包。

(4)一个jar包依赖的其他jar包,需要手动导入项目
  问题:所有jar包依赖关系都需要了解清楚,增加学习难度。
  解决:使用Maven可以自动将某jar包所依赖的jar包导入。

3、什么是构建

(1)什么是构建(不是创建)?
  以“Java源文件”、“框架配置文件”、“JSP”、“HTML”、“图片”等资源为原材料,“生产”出一个可以运行的项目,这个过程称为构建。分为编译、部署。
(2)编译:
  xxx.java源文件 >>> 经过编译 >>> xxx.class字节码文件 >>> JVM执行
(3)部署:
  一个B/S项目运行的并不是动态的Web工程源文件本身,而是编译后的Web工程。将Web工程经过编译后,部署到相应位置,启动服务器,才会去调用。
  对于文件路径的写法,以编译后的目录结构为准。

4、构建的流程

(1)清理:将target目录之前编译的字节码(.class)文件删除,为下一次编译做准备。
(2)编译:将Java源程序(.java)编译成新的字节码文件(.class)
(3)测试:自动测试,自动调用Junit程序。
(4)报告:报告程序执行的结果。
(5)打包:动态的Web工程打war包,Java工程打jar包。
(6)安装:将打包的文件复制到maven仓库的指定位置。
(7)部署:将war包复制到servlet容器指定的目录下,使其可以运行。
注:使用maven,可以自动化构建,省去了编译、打包、部署等操作。

二、Maven安装

1、下载Maven压缩包

历史版本下载:https://archive.apache.org/dist/maven/maven-3/
Apache官网下载:http://maven.apache.org/download.cgi/

2、检查JDK是否安装

因为Maven是Java编写的,需要JDK才能运行。

命令行输入:java -version    查看系统环境变量配置的JDK版本

3、Maven解压、配置环境变量

比如解压在 F:\maven 目录下
修改系统环境变量(类似JDK配置环境变量):
添加MAVEN_HOME或者M2_HOME环境变量的键,值为:F:\maven\apache-maven-3.6.1
PATH环境变量最后面加上:%MAVEN_HOME%\bin
输入mvn -version 或者 mvn -v,如果出现maven版本信息,则表示配置成功。

三、Maven核心概念

1、Maven有哪些概念

(1)约定的工程(模块)目录结构
(2)POM(工程对象模型)
(3)GAV坐标
(4)依赖(重点)
(5)仓库
(6)生命周期、插件、目标
(7)继承
(8)聚合

2、约定的标准Maven工程(模块)目录结构

技术图片

其中:
    src目录:表示的是 源码。
    target目录:表示的是 编译、打包后的文件。
    pom.xml目录:表示的是 maven核心配置文件。
    main目录:表示的是 存放主程序.
    test目录:表示的是 存放测试程序.
    class目录:表示的是  编译的字节码文件.
    java目录:表示的是 存放java源文件.
    resources目录:表示的是 存放框架或者其他工具的配置文件。
    
为什么要遵循约定的目录结构?	>>>	按照约定不用额外进行配置降低学习难度
	Maven负责自动化构建项目,以编译为例,maven想要自动进行编译,则必须知道java源文件的位置在哪,
按照约定(默认)的目录结构去找java源程序,这为maven的构建提供了便利。

注:
    约定(默认配置) > (手动)配置 > 编码
	既能用约定解决就不用配置实现;能用配置解决就不用编码实现。

3、常用maven命令

执行与构建过程相关的maven命令(如编译、测试、打包等)时,必须进入pom.xml所在的目录(既工程顶级目录),再执行命令。
注:若在不含pom.xml文件的目录下执行下方构建工程命令,会报错。
    常用命令:
        mvn clean;			清理字节码文件
        mvn compile; 		编译主程序文件
        mvn test-compile;	编译测试程序
        mvn test;  			执行测试junit
        mvn package;  		将项目打包成jar包或者war包
        mvn install;  		安装maven工程到本地仓库
        mvn site;  			生成站点

4、maven联网问题(插件下载)

(1)maven的核心程序仅定义了抽象的生命周期,具体的工作必须由不同的插件完成,但是这些插件并没有包含在maven的核心程序中。
(2)当执行某个maven命令需要使用某些插件时,首先会从本地仓库中查找。如果本地仓库中找不到那个指定的插件,则会自动联网去maven的中央仓库下载。若此时无法连接外网,则会执行失败。

5、手动使用maven下载jar包

(1)maven 中央仓库 地址为 :https://search.maven.org/
(2)进入地址后,搜索想要找的jar包。比如:mybatis。

技术图片

(3)点击,进入MyBatis,并点击某个版本并下载jar包

技术图片

6、修改本地仓库的配置文件

(1)找到maven解压包的下的 conf\settings.xml 文件。

比如:F:\maven\apache-maven-3.3.9\conf\settings.xml

(2)配置指定本地仓库目录

在 settings.xml 文件中找到 标签,并将地址改为自定义的路径。

例如:<localRepository>F:\maven\repository</localRepository>

(3)配置阿里云镜像

<mirrors>
     <mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  </mirror>
</mirrors>

7、POM

(1)POM : Project Object Model 项目对象模型。
(2)pom.xml:是maven工程核心配置文件,与构建过程相关的所有设置均在这个文件中进行配置。

8、GAV坐标

数学中:平面上通过X,Y两个向量,唯一定位平面中一点。
    空间上通过X,Y,Z三个向量,唯一定位空间中一点。

(2)maven中:
使用GAV三个值唯一定位一个maven工程。

<!-- groupId(组织、集团、公司标识符),一般是公司域名(一级域名.二级域名.三级域名.四级域名.项目名) -->
<groupId>mysql</groupId>

<!-- artifactId(工件标识符),一般为模块名 -->
<artifactId>mysql-connector-java</artifactId>

<!-- version,版本标识符 -->
<version>8.0.22</version>

(3)maven的GAV与目录的对应关系:

<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>

会对应到本地仓库中:
junit\junit\4.12\junit-4.12.jar
即 groupId\artifactId\version\artifactId-version.jar

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.8.RELEASE</version>
会对应到本地仓库中:
org\springframework\boot\spring-boot-starter-web\2.3.8.RELEASE\spring-boot-starter-web-2.3.8.RELEASE.jar

9、Maven仓库分类

(1)本地仓库:Maven配置文件中指向的仓库目录,为当前电脑的所有maven工程服务。
(2)远程仓库:
    公司私服:搭建在公司局域网中,为局域网范围内的所有maven工程服务。
    中央仓库:搭建在Internet上,为全世界范围内的maven工程服务。
    中央仓库镜像:为了分担中央仓库的压力,给访问分流,提升访问效率,比如阿里镜像、华为镜像。
(3)仓库保存的东西是什么?
    保存maven执行构建命令时所需要的插件。
    保存三方库(一方库指JDK,二方库指开发人员)框架或工具的jar包。
    保存自己开发的maven工程。
    即仓库保存的就是各种jar包。

10、依赖解析(重点)

(1)Maven解析依赖信息(即解析<dependency>标签的内容)时,会首先从本地仓库进行查找被依赖的jar包,没有则从远程仓库中找到被依赖的jar包,找到了目标jar包则会下载一份二到本地仓库中。
  针对自己开发的Maven工程,进入含有pom.xml所在的目录,执行 mvn install命令后,可以将自己开发的Maven工程安装到本地仓库中 。

(2)依赖的作用域(<scope>标签的内容):

作用域 对主程序是否有效 对测试程序有效 是否参与打包(部署) 典型例子
compile 有效 有效 参与 spring-core
test 无效 有效 不参与 junit
provided 有效 有效 不参与 servlet-api.jar

  原因分析

  • compile作用域的依赖:默认的依赖作用范围,开发时需要,部署时也需要(运行时servlet容器不会提供),一般的就是这样。
  • test作用域的依赖:主程序(main)是无法依赖test范围的jar的,开发时就不可以使用(那些jar主程序也是用不到的,主要是测试框架),只有测试程序可以依赖。要知道,测试程序常规是不参与打包的,test范围的依赖也不参与打包,只是在开发阶段会用到,或者maven编译(compile)时会执行测试程序。
    如果开发时主程序可以依赖test范围的jar,那么打包时由于test范围的jar不参与打包,所以打成的包运行时肯定就会报错。
  • provided作用域的依赖:开发时,由于没有运行时环境,有些jar我们需要暂时依赖(不依赖有些方法就会找不到,用不了),但是项目打包部署运行时,由于运行时环境(servlet容器,比如:tomcat)会提供一些jar包,所以开发时那些暂时依赖的jar包就不能参与打包了,否则会发生冲突导致报错。

(3)依赖的传递性:当一个模块工程A在pom.xml中配置了相关依赖信息,则其他模块工程B使用这个模块工程A时,不需要再额外的配置依赖的信息了,其会从A中传递到B中。
  注:只有compile与runtime范围的依赖才能进行传递。test、provided、system范围的依赖需要在每个工程中手动配置。

(4)依赖的删除(使用<exclusion>标签)
  在pom.xml文件所在的项目工程(模块)中,删除不希望出现的jar包。

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.1.8.RELEASE</version>
            <scope>compile</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-jcl</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

(6)传递依赖的原则:
  作用:解决多个模块工程间的jar包冲突问题。
  原则:当jar包冲突时
    路径最短者优先原则,即传递依赖发生时,优先选择距离(指引用jar包的深度更浅的)该工程最近的jar包。
    路径相同时,先声明(上下位置关系在上面的)的先。即标签先声明的jar包被使用。
  注:非传递依赖时(即直接依赖),以最后的标签声明的jar包为主。

(7)统一管理jar包的版本号
  使用标签,并自定义标签来声明版本号。
  在标签中,使用${自定义标签名}来引用。

  作用:可以使引用这个变量的所有jar包的版本快速修改

【未修改前:】
	<properties>
        <jar.version>5.1.7.RELEASE</jar.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${jar.version}</version>
        </dependency>
    </dependencies>

11、生命周期

(1)生命周期指的是各个构建环节的执行流程。

(2)maven的核心程序中定义了抽象的生命周期,生命周期的各阶段的具体任务由不同的插件来完成。

(3)为了更好的实现自动化构建,maven的核心程序对于生命周期的每个阶段,都从最开始clean执行,到该生命周期阶段 结束。比如执行 mvn compile 命令时,会从最开始clean执行,直到compile结束。

(4)插件和插件目标:
  生命周期的各阶段仅定义了要执行什么任务。
  各阶段与不同的插件目标(插件目标指的是调用插件的命令)相对应。
  相似的目标由特定的插件来解决。

技术图片

12、继承

(1)为什么使用继承?
  对于test,provided(非compile范围)作用域范围的依赖,由于不能进行依赖传递,所以需要在每个模块工程中单独定义,可能造成各个模块工程间的jar版本不一致。
  所以需要使用一个父工程,并定义好管理这些依赖的信息,令每个模块继承父工程,即可获得非compile范围的依赖信息。对依赖版本修改时,只需修改父工程即可。
  注意:每个子工程中相关的非compile范围的依赖仍需写,只是不需要再写版本号了。由父工程统一管理版本号。

  注意:使用继承后,在执行maven安装工程的命令时(maven install),必须先安装父工程,再安装子工程。若直接安装子工程,会由于没有找不到依赖的版本号而报错。

(2)继承的操作步骤
  第一步:创建一个父工程,并添加相关的非compile范围的依赖。
  注意:由于父工程一般只起到聚合子工程的作用,并无java代码,所以父工程创建时的打包方式需要选择 <packaging>pom</packaging>

POM是最简单的打包类型。不像一个JAR,SAR,或EAR,它生成的构件只是它本身。打包类型为POM的项目的默认目标

生命周期阶段 目标
package site:attach-descriptor
install install:install
deploy deploy:deploy

项目的打包类型:pom、jar、war

packing 默认是jar类型,如果不做配置,maven会将该项目打成jar包。

pom ---------> 父类型都为pom类型

jar ---------> 内部调用或者是作服务使用

war ---------> 需要部署的项目

【父工程pom.xml文件】
<?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.jia</groupId>
    <artifactId>maventest</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>maven_A</module>
    </modules>
</project>

第二步:在子工程中声明父工程。去除子工程中提示重复依赖的信息(可选操作)。

【子工程的pom.xml】
<?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">
    <parent>
        <artifactId>maventest</artifactId>
        <groupId>com.jia</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
             
    <artifactId>maven_A</artifactId>
</project>

第三步:在父工程<dependencyManagement>标签中统一管理依赖信息

<?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.jia</groupId>
    <artifactId>maventest</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>maven_A</module>
    </modules>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

第四步:在子工程中声明相应的依赖信息(注意:版本号无需写,写了的话,继承没意义了,相当于重新配置的依赖信息)

<?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">
    <parent>
        <artifactId>maventest</artifactId>
        <groupId>com.jia</groupId>
        <version>1.0-SNAPSHOT</version>
        <!-- 相对当前pom文件的位置找到父工程的pom路径 -->
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>maven_A</artifactId>

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

</project>

此时即可看到子工程中出现了父工程所配置的依赖信息。

当父工程修改配置信息时,所有的子工程的配置信息将会一起改变。

13、聚合

(1)作用:未使用聚合前,对每个工程(模块),需逐个安装,使用聚合后,可一键安装,只需安装父工程即可。
(2)步骤:
   第一步:在父工程中配置聚合。

【pom.xml】
 <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.test.maven</groupId>
    <artifactId>mavenDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <!-- 配置聚合 -->
    <modules>
        <!-- 根据当前pom.xml的位置,配置子工程所在的路径,maven会自动管理install顺序 -->
        <module>../demo2</module>
        <module>../demo3</module>
    </modules>

    <!-- 统一管理依赖配置信息 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
                <version>5.1.8.RELEASE</version>
                <scope>test</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

第二步:在父工程中执行mvn install即可。

技术图片

四、maven资源导出问题

maven资源导出发生问题pom.xml相关配置:https://www.cnblogs.com/pixy/p/4798089.html

五、Maven中使用公司内部仓库

设置maven配置文件settings.xml:https://blog.csdn.net/R812656252/article/details/86574441

Maven使用介绍

标签:star   provided   ima   yun   针对   sources   修改   下载方式   relative   

原文地址:https://www.cnblogs.com/hhddd-1024/p/14725168.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!