麻绳先生

做一些记录性的工作

maven

目前存在的问题

  1. 一个项目就是一个工程
    如果项目非常庞大,就不适用package来划分模块,最好每一个模块对应一个工程,利于分工协作。借助于maven就可以将一个项目拆分为多个工程。
  2. 项目中需要的jar包需要手动管理
    同样的文件出现在不同的工程中,浪费存储,让文件结构冗余。
  3. jar包来源复杂,难以维护
  4. jar包依赖的其他文件仍需手动管理

什么是maven

是一款服务于java平台的自动化构建工具。

什么是构建

以“java源文件”、“框架配置文件”、JSP、HTML、图片等资源为原材料产生一个可运行的项目的过程。

  • 清理:将之前编译生成的字节码文件删除,为下一次编译做准备
  • 编译:将java源程序编程为class字节码文件
  • 测试:自动测试,自动调用junit程序
  • 报告:测试程序执行的结果
  • 打包:动态web工程war包,java工程jar包
  • 安装:maven特定的概念,将打包得到的文件复制到仓库中指定位置
  • 部署:将动态web工程生成的war包复制到servlet容器的指定目录下

安装maven核心程序

  • 检查JAVA_HOME环境变量
  • 解压maven核心程序压缩包,英文无空格目录
  • 配置maven相关环境变量
    • MAVEN_HOME或M2_HOME(bin目录上一级)
    • path(通常带bin目录)
  • 运行mvn -v验证配置

maven核心概念

约定的目录

  • 根目录:工程名
    • 以配置的方式告诉框架自定义文件:classpath:spring-content.xml
  • src目录:存放源码
  • pom.xml:maven工程核心配置文件
  • main目录:存放主程序
  • test目录:存放测试程序
  • java目录:存放java源码
  • resources目录:存放框架或其他工具的配置文件

约定大于配置,配置大于编码

POM

含义:project object model项目对象模型

坐标(gav)

  • groupid:公司组织域名倒序+项目名
  • artifactid:模块名
  • version:版本

依赖

  • 对于自己的maven工程,使用install命令将其安装到仓库。
  • 依赖的范围
    • compile:对主程序有效,对测试程序有效,参与打包
    • test:对主程序无效,对测试程序有效,不参与打包
    • provided:对主程序有效,对测试程序有效,不参与打包,不参与部署,例如servlet-api.jar
  • scope
  • 只有compile范围的依赖可以传递
  • exclusions用于排除依赖

依赖的原则

  • 作用:解决模块工程之间的jar包冲突
    • 最短路路径优先
    • 路径相同时先声明者优先,指的是dependency标签的声明顺序

统一管理依赖的版本号

  • properties标签,后跟依赖的id
  • 通过${依赖的id}访问版本号
  • 由于test范围的依赖不能传递,所以必然分散在各个模块工程中,导致不一致问题
    • 解决思路:将依赖统一提取到父工程中,在子工程中声明依赖时不指定版本,以父工程中统一的设定为准,方便维护
    1. 创建一个maven工程为父工程,注意打包方式为pom
    2. 在子工程中声明对父工程的引用
    3. 将子工程中的坐标中与父工程坐标中重复的内容删除
    4. 在父工程中统一管理依赖
    5. 子工程中删除依赖的版本号

子工程要首先install父工程

仓库

生命周期/插件/目标

  • 各个构建环节执行的顺序是既定的;
  • maven核心程序中定义了抽象的生命周期;
  • 不论执行哪个命令,maven都会从生命周期最开始的位置执行;

继承

聚合

一键安装各个模块工程
在一个总的聚合工程中配置各个参与聚合的模块

1
2
3
4
5
<modules>
<module></module>
<module></module>
<module></module>
</modules>

常用maven命令

首先进入pom.xml目录

  • mvn clean:清理
  • mvn compile:编译主程序
  • mvn test-compile:编译测试程序
  • mvn test:执行测试
  • mvn package:打包
  • mvn install:安装
  • mvn site:生成站点

自动部署

通过build标签配置当前工程的构建过程中的特殊设置,cargo插件。