浅谈对Maven的一些理解

开发人员需要了解的Maven的基本知识

身为一个后端开发,Maven 是我们日常开发项目中经常在用到的,例如 Eclipes 或者是 IDEA 等一些开发工具给我们提供的快捷清理,打包,编译方式,又例如我们在在项目开发中添加依赖只需要在 POM 添加一些依赖标签进行依赖管理,这些都和 Maven 密切相关,这是 Maven给我们提供的一种便利,这样我们就可以不用像以前那样一个一个去找 jar 包依赖,解决有可能发生的依赖冲突等问题。既然Maven这么神奇,我们自然有必要深入的去了解一下Maven的一些原理,以便于我们管理项目更得心应手。

1.没有Maven之前的技术在开发中存在的问题(why)

  1. 一个项目就是一个工程

    如果一个项目非常庞大,不适合用packge来划分模块, 最好是每一个模块对应一个工程 分工合作.

    借助于Maven就可以将一个项目拆分成多个工程.

  2. 项目中需要的jar包必须手动"复制","粘贴"到WEB-INF/lib目录下

    带来的问题是:同样的jar包文件重复出现在不同的项目工程中, 一方面浪费存储空间比较臃肿

    借助Maven, 可以将jar包仅仅保存在"仓库"中, 有需要使用的工程"引用"这个文件接口, 并不需要真的把jar包复制过来.

  3. jar包需要别人替我们准备好,或者官网下载

    不同技术的官网提供jar包下载的形式是五花八门的.

    有些技术的官网就是通过Maven或AVN等专门的工具来提供下载的.

    如果是以非正规的方式下载的jar包, 那么其中的内容很可能也是不规范的.

    借助于Maven可以以一种规范的方式下载jar包, 因为所有的知名框架或者第三方工具的jar包都以统一的规范存放在Maven的中央仓库中.

    以规范的方式下载的jar包, 内容也是可靠的.

    Tips: “统一的规范”, 不仅仅是对IT开发领域非常重要, 对于整个人类社会都是非常重要.

  4. 一个jar包依赖的其他jar包需要自己手动加入到项目中

    如果所有的jar包之间的依赖关系都需要程序员自己非常清楚的了解, 那么就会极大的增加学习成本

    Maven会自动将依赖的jar包导入进来.

2、Maven是什么(what)?

没有任何解释能比官方解释更权威了,摘自 Maven 官网的一句话,

Maven, a Yiddish word meaning accumulator of knowledge, was originally started as an attempt to simplify the build processes in the Jakarta Turbine project. There were several projects each with their own Ant build files that were all slightly different and JARs were checked into CVS. We wanted a standard way to build the projects, a clear definition of what the project consisted of, an easy way to publish project information and a way to share JARs across several projects
Maven是一个意义上的累积词,意第绪语,最初是为了简化Jakarta Turbine项目中的构建过程而开始的。有几个项目都有自己的Ant构建文件,这些文件都略有不同,JAR被检入CVS。我们需要一种标准的方法来构建项目,明确定义项目的内容,发布项目信息的简便方法以及跨多个项目共享JAR的方法

The result is a tool that can now be used for building and managing any Java-based project. We hope that we have created something that will make the day-to-day work of Java developers easier and generally help with the comprehension of any Java-based project.

结果是一个工具,现在可用于构建和管理任何基于Java的项目。我们希望我们已经创建了一些东西,使Java开发人员的日常工作更容易,并且通常有助于理解任何基于Java的项目。>

简单说,Maven是一款 服务于Java服务平台 的自动化 构建 工具,它可以帮我们进行项目依赖的管理以及构建。
想想项目的构建过程

[1]清理: 将以前编译得到的旧的class字节码文件删除 , 为下一次编译做准备

[2]编译: 将Java源程序编译成class字节码文件

[3]测试: 自动测试, 自动调用junit程序

[4]报告: 测试程序执行的结果

[5]打包: 动态Web工程打war包, Java工程打jar包

[6]安装: maven特定的概念 —将打包得到的文件复制到"仓库"中的指定位置

[7]部署: 将动态Web工程生成war包复制到Servlet容器的指定目录下, 使其可以运行.

3、如何使用Maven(how)?

  • 下载 Maven 地址: http://maven.apache.org/download.cgi
  • 检测JAVA_HOME环境变量,没有则要下载 JDK 配置
  • 解压maven核心程序的压缩包, 放在一个非中文无空格路径下,例如我的安装路径是:

D:\workTools\apache-maven-3.3.9
  • 配置Maven相关的环境变量

    • [1] MAVEN_HOME或M2_HOME(适应老版本)

    MAVEN_HOME :D:\workTools\apache-maven-3.3.9
    • [2] Path

    PATH :D:\workTools\apache-maven-3.3.9\bin
  • 验证: 运行mav -v 命令查看Maven版本

Maven的核心概念

1、约定的目录结构 (必须遵守才能享受Maven的便利)

  1. Maven项目约定的目录结构

Maven项目的目录结构

|----project_name
| 
|---src  				源码包
| 	|
| 	|--main				存放主程序
| 	|	|
| 	|	|- java			存放Java源文件
| 	|	|	
| 	|   |-resource 		存放框架或其他工具的配置文件
| 	|		
| 	|--test				测试程序
| 	 	|
| 	 	|-java			存放测试源码
| 
|---target				编译后目录结构
| 			
|---pom					Maven工程核心配置
	
  1. 问什么要遵守约定的目录结构呢?

    • Maven要赋值我们这个项目的自动化构建, 以编译为例, Maven要想自动进行编译, 那么它必须知道Java源文件保存在哪里.才能帮我们自动构建。

    • 有了这个约定,我们不管碰到什么样的Maven项目都能够清晰的了解其项目结构

    • 约定 > 配置 > 编码

2、POM

  1. 含义: Project Object Model 项目对象模型

    DOM Document Object Model 文档对象模型

  2. pom.xml对于Maven工程是核心配置文件, 与构建过程相关的一切设置都在这个文件中进行配置

    重要程序相当于web.xml对于动态web工程

3、坐标

  1. 数学中的坐标:

    [1].在平面上. 使用X,Y两个向量可以唯一的定位平面上的任意一个点

    [2]在空间中, 使用X,Y,Z三个向量可以唯一的定位空间中的任何一个点

  2. Maven的坐标

    使用下面三个向量在查看中唯一定位一个Maven工程

    [1] groupid : 公司或组织域名倒序 + 项目名

    <groupid>com.ethan.maven</groupid>
    

    [2] artfactid : 模块

    <artifactid>Hello</artifactid>
    

    [3] version : 版本

    <version>1.0.0</version>
    
    1. Maven工程的坐标与仓库中路径的对应关系
    <groupid>org.springframework</groupid>
    <artifactid>spring-core</artifactid>
    <version>4.0.0.RELEASE</version>
    
    org/springframework/spring-core/4.0.0.RELEASE/spring-core-4.0.0.RELEASE.jar
    

4、仓库

Maven也有一个仓库的概念,

  1. 仓库的分类

    • 本地仓库:

      • 1当前电脑上部署的仓库, 为当前电脑上所有Maven工程服务,当你的Maven项目依赖一个jar包的时候,首先会从本地仓库中去查找,如果本地仓库没有,那么Maven会从Maven的中央仓库去把这个jar包给下载到本地仓库
    • 远程仓库:

      • 私服: 架设在当前局域网环境下, 为当前局域网范围内所有Maven工程服务
      • 中央仓库: 架设在Internet上, 为全世界所有Maven工程服务
      • 中央仓库镜像:架设在各大洲, 为中央仓库分担流量, 减轻中央仓库的压力, 同时更快的响应用户请求
  2. 仓库中保存的内容: Maven工程

    [1]Maven自身所需要的插件

    [2]第三方框架或工具的jar包

    [3]我们自己开发的Maven工程

  3. 本地仓库的补充内容

安装Maven后,如果你指定了Maven仓库的位置,则仓库在你指定的路径中,如果未指定,默认会在当前用户下的 .m2 文件加下,例如:

C:\Users\15797\.m2\repository

这个就是我们电脑的本地仓库,这个目录下会有一个repository文件夹和一个setting.xml文件,repository就是我们Maven的仓库所在的文件夹,也就是说,所有依赖的jar包都统一保存在这个文件夹下
举个依赖的例子:

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>

上面这个依赖对应在仓库中的位置为:

C:\Users\15797\.m2\repository\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.3.2

setting.xml文件是Maven的配置文件,你可以找到Maven安装目录下的conf文件夹下的 setting.xml 去指定我们仓库的位置
在这里插入图片描述
例如:指定在 D:/workTools/apache-maven-3.3.9/repertory

<localRepository>D:/workTools/apache-maven-3.3.9/repertory</localRepository>

5、依赖

  1. Maven解析依赖信息时会到本地的仓库中查找被依赖的jar包
    对于我们自己开发的maven工程, 使用mvn instail命令安装后就可以进入仓库
  2. 依赖的范围
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>  <!--可以通过这个标签指定依赖的范围-->
        </dependency>

我们可以通过 scope 标签来指定依赖包生效的范围,常用的取值有 compiletestprovide

[1] compile范围依赖

  • 对主程序是否有效:有效
  • 对测试程序是否有效: 有效
  • 是否参与打包: 参与
  • 是否参与部署: 参与
  • 典型例子: spring-core

[2] test范围依赖

  • 对主程序是否有效: 无效
  • 对测试程序是否有效: 有效
  • 是否参与打包: 不参与
  • 是否参与部署: 不参与
  • 典型例子: junit

[3] provided范围依赖

  • 对主程序是否有效: 有效

  • 对测试程序是否有效: 有效

  • 是否参与打包: 不参与

  • 是否参与部署: 不参与

  • 典型的例子: servlet-api.jar

6、生命周期/插件/目标

  1. 各个构建环节执行的顺序: 不能打乱顺序, 必须按照既定的正确顺序来执行

  2. Maven的核心程序中定义了抽象的生命周期, 生命周期中各个阶段的具体任务是由插件来完成的

  3. Maven有三套相互独立的生命周期, 分别是:

    [1]Clean Lifecycle 在进行真正的构建之前进行一些清理工作

    [2]Default Lifecycle 构建的核心部分, 编译, 测试, 打包 ,安装, 部署等等

    [3].Site Lifecycle 生成项目报告, 站点, 发布站点

    它们是相互独立的, 你可以仅仅调用clean来清理工作目录, 仅仅调用site来生成站点, 当然也可以直接运行mvn clean install site 运行所有的这三套生命周期

    clean:清理项目  
    		pre-clean(执行一些清理前需要完成的工作) 
    		clean (清理上一次构建生成的文件,最常用) 
    		post-clean(执行一些清理后需要完成的工作)
    default:构建项目  
        process-sources(处理项目主资源文件,将src/main/resources目录的内容经过处理后,复制到项目输出的主	classpath目录中) 
    	compile(编译项目主源码,编译src/main/java目录下的java文件至项目输出的主classpath目录中) 
    	process-test-source(处理项目测试资源文件。对src/test/resources目录) 
    	test-compile(编译项目的测试代码) 
    	test (使用单元测试框架运行测试,测试代码不会被打包或部署) 
    	package (接受编译好的代码,打包成可发布格式) 
    	install (发布到本地仓库)  Install是给自己工程依赖 
    	deploy (发布到远程仓库)  deploy是给项目组其他成员依赖
    site:建立和发布项目站点                                   
         	    site (生成项目站点文档) 
         	    site-deploy(将生成的项目站点发布到服务器上) 
    
  4. Maven核心程序为了更好的实现自动化构建, 按照这一特点执行生命周期中的各个阶段: 不论现在要执行生命周期中的哪一个阶段, 都是从这个生命周期最初的位置开始执行

  5. 插件和目标

    [1]声明周期的各个阶段仅仅定义了要执行的任务是什么

    [2]各个阶段和插件的目标是对应的

    [3]形式的目标由特定的插件来完成

    [4]可以将目标看作"调用插件功能的命令"

7、继承、聚合

可将多个项目聚合在一个工程下
在这里插入图片描述
父POM中可以引入子模块中公共依赖,这样父工程导入的依赖在下面4个子模块中也可以使用,这样就可以避免重复导入依赖的问题,而且我们还可以在父工程中进行依赖的统一管理。
父POM的配置,用modules声明要聚合的子模块的 artifactId

	<groupId>com.partybuild</groupId>
	<artifactId>partybuild</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>pom</packaging>
	<modules>
		<module>partybuild-admin</module>
		<module>partybuild-api</module>
		<module>partybuild-common</module>
		<module>partybuild-core</module>
		<module>partybuild-service</module>
	</modules>

其中一个子模块的POM配置,用parent指定父POM的坐标

    <parent>
        <groupId>com.partybuild</groupId>
        <artifactId>partybuild</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>partybuild-admin</artifactId>
    <packaging>war</packaging>

Maven涉及的点比较多,不是一篇文章就能概括的,今天就先写到这,续…

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值