maven学习总结(很乱)

本文只是作为本人学习总结使用

一 什么是maven

定义:一个项目管理工具,包含了一个项目对象模型(POM: Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统以及用来运行定义在生命周期阶段中插件目标的逻辑

作用:帮助构建项目,管理jar包,编译代码,自动运行单元测试,打包,甚至可以帮助部署项目

两种常见应用方向:
1)依赖管理:就是不像传统项目一样将 jar 放在项目中,而是将所用 jar 统一放在 仓库 中,然后通过 坐标 去读取加载 jar 包。这种方式在项目越多,不同项目使用的 jar 包越相同的时候好处会越来越大
2)一键构建:就是项目从 编译–测试–运行–打包–安装–部署 这整个过程都交给 maven 进行管理

二 目录结构

maven学习总结(很乱)_第1张图片

bin:存放了 maven 的命令
boot:存放了一些 maven 本身的引导程序,如类加载器等
conf:存放了 maven的一些配置文件,如 setting.xml 文件
lib:存放了 maven 本身运行所需的一些 jar 包

ps:安装就不详细记了,就是官网下载然后解压然后配置环境变量就可以了,当然,前提是要安装好JDK

三 maven的仓库分类

分为三种:本地仓库,远程仓库(私服),中央仓库

  • 本地仓库:
    存储着从远程仓库或者中央仓库下载回来的插件或 jar 包,项目使用一些插件或 jar包,优先从本地仓库中查找。
    默认本地仓库的位置在:

    ${user.dir}/.m2/repository

    ${user.dir}表示用户目录

  • 远程仓库(私服)
    本地没有的插件或 jar 包,默认去远程仓库下载(如果配置好的话)
    远程仓库可以在互联网内也可以在局域网内

  • 中央仓库

    http://repo1.maven.org/maven2

    包含了世界上大部分流行的开源项目构件,由 Maven 团队自己维护,服务于整个互联网

1)本地仓库的配置
在目录结构的 conf/setting.xml 中
maven学习总结(很乱)_第2张图片
2)全局 setting 与 用户 setting
全局 setting 在安装目录下的 conf/settings.xml, 用户 setting 默认位 置在${user.dir}/.m2/settings.xml

四 maven 工程目录

一个完整的 maven 工程目录应该是这个样子的
maven学习总结(很乱)_第3张图片
去掉.idea文件夹与maven_web.iml这些工具生成的文件,解释如下

src/main/java —— 存放项目的.java 文件
src/main/resources —— 存放项目资源文件,如 spring配置文件
src/main/webapp —— 页面素材,js,css,images,jsp等
src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
src/test/resources —— 测试资源文件
target —— 项目输出位置,编译后的 class 文件会输出到此目录
pom.xml——maven 项目核心配置文件
ps:普通 java 工程没有 webapp 文件夹

五 maven 常用命令

  • compile: 编译,将 src/main/java 下的文件编译成 class 文件输出到 target目录下
  • test:测试,执行 src/test/java 下的单元测试类
  • clean:清理,删除 target 目录及内容
  • package:打包,对 java 工程打包成 jar 包,web 工程搭成 war 包
  • install:安装,将打包工程发布到本地仓库

六 生命周期

共有三套生命周期,生命周期相互独立

  • Clean Lifecycle 清理生命周期,对应命令即 clean
  • Default Lifecycle 默认生命周期,对应 compile,test,package,install,deploy 命令
  • Site Lifecycle 生成项目报告,站点,发布站点(不常用)

七 概念模型

Maven 以下概念模型

  • 项目对象模型(Project Object Model)
    一个 maven 工程都有一个 pom.xml 文件,通过 pom.xml 文件定义项目 的坐标、项目依赖、项目信息、插件目标等
  • 依赖管理系统(Dependency Management System)
    通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理
	
	
	
		
			
			junit
			
			junit
			
			4.9
			
			test
		
	

补充:关于依赖中的 scope 值,即依赖范围
maven学习总结(很乱)_第4张图片

  • 一个项目生命周期
    使用 maven 完成项目的构建,项目构建包括:清理、编译、测试、部署等过程, maven 将这些过程规范为一个生命周期:清理,编译,测试,报告,打包,部署
  • 一组标准集合
    maven 将整个项目管理过程定义一组标准,比如:通过 maven 构建工程有标准的目录结构,有
    标准的生命周期阶段、依赖管理有标准的坐标定义等
  • 插件(plugin)目标(goal)
    maven 管理项目生命周期过程都是基于插件完成的

八 idea集成maven

集成是十分简单,首先要确保电脑中已经存在maven。然后打开idea,找到maven配置
maven学习总结(很乱)_第5张图片
然后在当前maven目录下有一个Runner,点击可见

maven学习总结(很乱)_第6张图片
-DarchetypeCatalog=internal
这个配置原因详见https://www.cnblogs.com/del88/p/6286887.html

九 此处是使用 idea 创建 maven 工程记录

暂不完整,以后再补
配置 jdk 编译版本以及 tomcat7 插件


    
      
          org.apache.tomcat.maven
          tomcat7-maven-plugin
          2.2
          
              8888
          
      
      
        org.apache.maven.plugins
        maven-compiler-plugin
        
          1.8
          1.8
          UTF-8
        
      
    
  

十 依赖传递,依赖冲突,依赖调解原则

什么是依赖传递

项目依赖 a.jar ,a.jar 依赖 b.jar , b.jar 也会出现在项目中。这种现象称之为依赖传递

依赖冲突

项目依赖两个 jar,这两个 jar 都依赖 另一个 jar,但是依赖的版本不一样,如v1,v2。这个时候肯定只有一个版本会出现在工程里,但我们需要的却是另一个版本的话,就出现了所谓的依赖冲突

依赖调解原则

  1. 第一声明者优先原则

a.jar 依赖 c.jar v1版本,b.jar 依赖 c.jar v2版本,先依赖 a 再依赖 b,项目中出现 c.jar v1版本,反之则出现 v2 版本。

  1. 路径近者优先原则

如果直接依赖 c.jar v3 版本,那么项目中就会出现这个版本,跟a.jar,b.jar的依赖顺序没有关系了

  1. 排除依赖
 
 	
		xxxx
        xxx
	

通过上述标签排除 a.jar 中的 c.jar 依赖,标签在标签内

十一 锁定版本


      
        
          org.springframework
          spring-context
          ${spring.version}
        
        
          org.springframework
          spring-web
          ${spring.version}
        
      
    

锁定版本后不需要考虑依赖的声明顺序或依赖的路径,以锁定的版本为准。注意:版本只是锁定,并未将 依赖 加入工程。

十二 分模块构建工程

涉及三方面:拆分,继承,聚合
拆分与继承的目的都在于消除重复,拆分,比如将dao,service,controller层拆分成三个模块,这样如果有多个端(小程序/app/后台)都涉及dao层的业务逻辑的话,就消除了重复。继承主要是是为了消除pom文件的重复。聚合则是将拆分的模块间依赖起来,比如service层需要依赖dao层,controller层需要依赖service层

十三 依赖范围对传递依赖的影响

maven学习总结(很乱)_第7张图片
A依赖B(理解为最左一列),B依赖C理解为最上一行,那么A依赖C就是行列的交叉
比如A依赖B的依赖范围是compile,B依赖C的依赖范围是runtime,那么A依赖C的依赖范围是runtime

你可能感兴趣的:(maven)