Maven

Posted 新火且试茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Maven相关的知识,希望对你有一定的参考价值。

一、用来解决开发中存在的如下问题:

  1. 一个项目就是一个工程
    如果项目非常庞大,就不适合继续使用package来划分模块。最好是每一个模块对应一个工程,利于分工协作。

  2. 项目中需要的jar包必须手动“复制”、“粘贴”到WEB-INF/lib目录下
    带来的问题是:同样的jar包文件重复出现在不同的项目工程中,一方面浪费存储空间,另外也让工程比较臃肿。
    且用Maven,可以将jar包仅仅保存在“仓库”中,有需要使用的工程“引用”这个文件接口,并不需要真的吧jar包复制过来。

  3. jar包需要别人替我们准备好,或到官网下载。
    借助于Maven可以以一种规范的方式下载jar包。因为所有知名框架或第三方工具的jar包以及按照统一的规范存放在了Maven的中央仓库中。

  4. 一个jar包依赖的其他jar包需要自己手动加入到项目里
    如果所有jar包的依赖关系都要知道,将会大大增加学习成本

二、Maven是什么

  1. Maven是一款服务于java平台的自动化构建工具。Make-》Ant-》Maven-》Gradle

  2. 构建

    1. 概念:以“java源文件”,“框架配置文件”、“JSP”、“html”、“图片”等资源为“原材料”,去生产一个可以运行的项目的过程。
      编译 部署 搭建
    2. 编译:java源文件-》编译-》class字节码文件-》JVM执行
    3. 部署:一个BS项目最终运行的并是不是动态Web工程本身,而是这个动态Web工程编译的结果。
  3. 构建过程中的各个环节

    1. 清理:将以前编译得到的旧的class字节码文件删除,为下一次编译做准备
    2. 编译:将java源程序编译成class字节码文件
    3. 测试:自动测试,自动调用junit程序
    4. 报告:测试程序执行的结果
    5. 打包:动态web工程打war包,java工程打jar包
    6. 安装:Maven特定的概念——将打包得到的文件赋值到“仓库”中的指定位置
    7. 部署:将动态web工程生成的war包复制到servlet容器的指定目录下,使其可以运行
  4. 自动化构建

三、安装Maven核心程序

  1. 将核心程序解压在一个无空格和中文的路径下
  2. 配置Maven相关的环境变量
    1. 新建MAVEN_HOME或M2_HOME,添加上maven的bin目录的上级目录
    2. path路径添加上bin目录
  3. 验证安装是否成功:cmd下mvn-v

四、Maven的核心概念

  1. 约定的目录结构
  2. POM
  3. 坐标
  4. 依赖
  5. 仓库
  6. 生命周期/插件/目标
  7. 继承
  8. 聚合
  9. 部署

五、第一个Maven工程

  1. 创建约定的目录结构
Hello(根目录,项目名)
|---src(源码)
|---|---main(存放主程序)
|---|---|---java(存放java源文件)
|---|---|---resource(存放框架或其他工具的配置文件)
|---|---test(存放测试程序)
|---|---|---java(存放java源文件)
|---|---|---resource(存放框架或其他工具的配置文件)
|---pom.xml(Maven工程的核心配置文件)

六、常用Maven命令

  1. 注意:执行与构建过程相关的命令,必须进入pom.xml所在的目录。
  2. 常用命令
    1. mvn clean:清理
    2. mvn compile:编译主程序
    3. mvn test-compile:编译测试程序
    4. mvn test:执行测试
    5. mvn package:打包
    6. mvn install:安装
    7. mvn site:生产站点
  3. 构建的产品会生成在target文件夹下

七、关于联网问题

  1. Maven的核心程序中仅仅定义了抽象的声明周期,但是具体的工作必须由特定的插件来完成。而插件本身并不包含在Maven的核心程序中。
  2. 当我们执行的Maven命令需要用到某些插件时,Maven核心程序首先回到本地仓库中查找。
  3. 本地仓库的默认位置:【系统中当前用户家目录.m2 epository】
  4. Maven核心程序如果在本地仓库找不到需要的插件,那么它会自动连接外网,到中央仓库下载。
  5. 如果此时无法连接外网,则构建失败
  6. 修改Maven默认本地仓库的位置可以让Maven核心到我们实现准备好的目录下查找插件。
    1. 找到Maven解压目录confsetting.sml
    2. 在setting.xml文件中找到localRepository标签
    3. path/to/local/repo从注释中取出
    4. 将标签内的路径修改为已经准备好的Maven仓库目录

八、POM

  1. 含义:Project Object Model项目对象模型
  2. pom.xml对于Maven工程是核心配置文件,与构建过程相关的一切设置都在这个文件进行配置。重要程度相当于web.xml对于动态Web工程。

九、坐标

  1. 使用三个向量(g,a,b)在仓库中唯一定位一个Maven工程
1. groupid:公司或组织域名倒序+项目名
<groupId>域名倒序+项目名</groupId>

2. artifactid:模块名
<artifactId></artifactId>

3. version:版本
<version>1.0.0<version>
  1. Maven工程的坐标与仓库中路径的对应关系
    例坐标如下
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.0.0.RELAESE</version>

那么便可以在maven仓库根目录下得到对应文件路径

org/springframework/spring-core/4.0.0.RELAESE/spring-core-4.0.0.RELAESE.jar

十、仓库

  1. 仓库的分类
    1. 本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务
    2. 远程仓库:
      (1)私服:搭建在当前局域网环境下,为当前局域网范围内的所有Maven工程服务。
      (2)中央仓库:架设在Internet上,为全世界所有Maven工程服务。
      (3)中央仓库的镜像:为了分担中央仓库的流量,提升用户访问速度。
  2. 仓库中保存的内容:Maven工程
    1. Maven自身所需的插件
    2. 第三方框架或工具的jar包
    3. 我们自己开发的Maven工程

十一、依赖

  1. Maven解析依赖时回到本地仓库中查找被依赖的jar包。
    对于我们自己开发的Maven工程,使用mvn install命令安装后就可以进入仓库

  2. 依赖的范围

    1. compile范围依赖
      • 对主程序是否有效:有效
      • 对测试程序是否有效:有效
      • 是否参与打包:参与
    2. test范围依赖
      • 对主程序是否有效:无效
      • 对测试程序是否有效:有效
      • 是否参与打包:不参与
      • 典型例子:junit
    3. provided范围依赖
      • 对主程序是否有效:有效
      • 对测试程序是否有效:有效
      • 是否参与打包:不参与
      • 是否参与部署:不参与
      • 典型例子:servlet-api.jar(开发时候需要用,但是tomcat服务器上有,不需要再拿过去)
  3. 依赖的传递性
    [1]好处:可以传递的依赖不必在每个模块工程中都重复声明,在“最下面”的工程中依赖一次即可
    [2]注意:非compile范围的依赖不能传递。所以在各个工程模块中,如果有需要就得重复声明依赖

  4. 依赖的排除
    [1]需要设置依赖排除的场合。将jar包中不需要的jar包排除掉
    [2]依赖排除的方式

<exclusions>
    <exclusion>
        <groupId>commons-logging<groupId>
        <artifactId>commons-logging</artifactId>
    <exclusion>
</exclusions>
  1. 依赖的原则
    [1]作用:解决模块工程之间的jar包冲突问题
    路径最短原则:最靠近的优先。
    路径相同时,先在dependency标签中声明的优先

  2. 统一管理依赖的版本号

  3. 情景举例

  • 如果要对spring的各个jar包进行统一升级。手动逐个修改不可能
  1. 建议配置方式
    1. 使用properties标签,在内部自定义标签统一声明版本号
    2. 在需要统一版本的位置,使用${自定义标签名}引用声明的版本号。需要统一声明在引用的地方都可以通过properties标签来管理。

十二、生命周期

  1. 各个构建环节执行的顺序,不能打乱顺序,必须按照既定的正确顺序来执行
  2. Mavne的核心程序中定义了抽象的声明周期,生命周期的各个阶段的具体任务是由插件来完成的。
  3. Maven核心程序为了更好的实现自动化构建,按照这一特点执行生命周期的各个阶段;不论现在要执行生命周期的哪一个阶段,都是从这个生命周期最初的位置开始。
  4. 插件和目标
    1. 生命周期的各个阶段仅仅定义了要执行的任务是什么。
    2. 各个阶段和插件的目标是对应的。
    3. 相似的目标由特定的插件来完成。

十三、在Eclipse中使用Maven

  1. 创建Maven版的java工程
  2. 创建Maven版的web工程
  3. 执行Maven命令

设置通过Maven创建工程的JDK版本

  1. 打开setting.xml文件
  2. 找到profiles标签
  3. 加入如下配置
<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>

十四、继承

  1. 现状
    Hello依赖的junit:4.0
    HelloFriend依赖的junit:4.0
    MakeFriends依赖的junit:4.9
    由于test范围的依赖不能传递,所以必然会分散在各个模块工程中,很容易造成版本不一致。
  2. 需求:统一管理各个模块工程中对junit依赖的版本
  3. 解决思路:将junit依赖统一提取到“父工程”中,在子工程中声明junit依赖时不指定版本,以父工程统一设定的为准。同时也便于修改。
  4. 操作步骤
    1. 创建一个Maven工程作为父工程。注意:打包的方式为pom
    2. 在子工程中声明对父工程的引用
    3. 将子工程的坐标与父工程坐标中重复的内容删除
    4. 在父工程中统一管理junit的依赖
    5. 在子工程中删除junit依赖的版本号部分
<parent>
    <groupId>父工程名</groupId>
    <artifactId>父工程项目名</artifactId>
    <version>父工程版本号</version>

    <!-- 可以添加父工程pom.xml相对于当前子工程pom.xml的相对路径-->
    <relativePath>路径</relativePath>
</parent>
<dependencyManagement>
<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.0</version>
            <scope>test</scope>
        </dependency>
</dependencies>
</dependcyManagement>
  1. 配置继承后,执行安装命令时要先安装父工程。

十五、聚合

  1. 作用:一键安装各个模块工程
  2. 配置方式:在一个“总的聚合工程”中配置各个参与聚合的模块。可以在父工程中,也可以专门为此新建工程
<!--配置聚合-->
<modules>
    <!--指定各个子工程的相对路径-->
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../MakeFriend</module>
</modules>
  1. 使用方式:在聚合工程的pom.xml上点右键->run as ->maven install

十六、自动部署

<build>
    <finalName>最终项目名</finalName>
    //配置构建构成中需要使用的插件
<plugins>
     <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-release-plugin</artifactId> 
        <version>2.0-beta-9</version> 
        <configuration>
            //配置当前系统中容器的位置
            <container>
                <containerId>tomcat8x</containerId>
                <home>tomcat所在路径</home>
            </container>
            <useReleaseProfile>false</useReleaseProfile> 
            <goals>deploy</goals> 
            <scmCommentPrefix>[bus-core-api-release-checkin]-< /scmCommentPrefix>
        </configuration> 
    </plugin> 
</plugins>
</build>

十七、Maven依赖信息的网站

http://mvnrepository.com/























以上是关于Maven的主要内容,如果未能解决你的问题,请参考以下文章

Spring+SpringMVC+MyBatis+Maven框架整合

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

如何在 Apache Felix maven-bundle-plugin 中设置 Provide-Capability 标头?

Maven FTP部署:无法创建目录

如何从詹金斯访问maven属性?

向小军 “小黑” 正式加入 Maven Skateboards