• Java 项目管理工具 Maven


    为什么使用项目管理工具


    由于 Java 的生态非常丰富,无论你想实现什么功能,都能找到对应的工具类,这些工具类都是以 jar 包的形式出现的,例如 Spring,SpringMVC、MyBatis、数据库驱动,等等,都是以 jar 包的形式出现的,jar 包之间会有关联,在使用一个依赖之前,还需要确定这个依赖所依赖的其他依赖,所以,当项目比较大的时候,依赖管理会变得非常麻烦臃肿,这是 Maven 解决的第一个问题。

    Maven 还可以处理多模块项目。简单的项目,单模块分包处理即可,如果项目比较复杂,要做成多模块项目,例如一个电商项目有订单模块、会员模块、商品模块、支付模块...,一般来说,多模块项目,每一个模块无法独立运行,要多个模块合在一起,项目才可以运行,这个时候,借助 Maven 工具,可以实现项目的一键打包。

    Maven 之前,我们更多的是使用 Ant 的项目构建工具,Ant 有一个特点,每次都得写,每次都写的差不多,配置也臃肿。所以,后来搞出来 Maven。Maven 就是最先进的版本构建工具吗?不是的,只不过,目前在 Java 领域 Maven 使用比较多。除了 Maven,还有 Gradle。

    Maven 是什么


    Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。

    当我们使用 Maven 的使用,通过一个自定义的项目对象模型,pom.xml 来详细描述我们自己的项目。

    Maven 中的有两大核心:

    Maven 安装


    下载 Maven:http://maven.apache.org/download.cgi

    img

    解压文件

    img

    配置环境变量

    1. 首先配置 MAVEN_HOME

      img

    2. 配置环境变量

      img

    3. 检验安装

      img

    如果使用了 IntelliJ IDEA ,可以不用去额外下载 Maven,直接使用 IDEA 中自带的 Maven 插件即可。IntelliJ IDEA 中自带的 Maven 插件在 IDEA文件夹名pluginsmavenlibmaven3

    Maven 配置


    实际上,没有特殊需求的话,安装好之后直接就可以用了。一般来说,还是需要稍微配置一下,比如中央仓库的问题。默认使用 Maven 自己的中央仓库,使用起来网速比较慢,这个时候,可以通过修改配置文件,将仓库改成国内的镜像仓库,国内仓库使用较多的是阿里巴巴的仓库。

    仓库类型

    仓库类型 说明
    本地仓库 就是你自己电脑上的仓库,每个人电脑上都有一个仓库,默认位置在 当前用户名.m2 epository
    私服仓库 一般来说是公司内部搭建的 Maven 私服,处于局域网中,访问速度较快,这个仓库中存放的 jar 一般就是公司内部自己开发的 jar
    中央仓库 有 Apache 团队来维护,包含了大部分的 jar,早期不包含 Oracle 数据库驱动,从 2019 年 8 月开始,包含了 Oracle 驱动

    现在存在 3 个仓库,那么 jar 包如何查找呢?

    img

    本地仓库配置

    本地仓库默认位置在 当前用户名.m2 epository,这个位置可以自定义,但是不建议大家自定义这个地址,有几个原因:

    1. 虽然所有的本地的 jar 都放在这个仓库中,但是并不会占用很大的空间。
    2. 默认的位置比较隐蔽,不容易碰到

    技术上来说,当然是可以自定义本地仓库位置的,在 conf/settings.xml 中自定义本地仓库位置:

    img

    远程仓库配置

    由于默认的中央仓库下载较慢,因此,也可以将远程仓库地址改为阿里巴巴的仓库地址:

    <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    

    这段配置,加在 settings.xml 中的 mirrors 节点中:

    img

    Maven 常用命令


    常用命令 中文含义 说明
    mvn clean 清理 这个命令可以用来清理已经编译好的文件
    mvn compile 编译 将 Java 代码编译成 Class 文件
    mvn test 测试 项目测试
    mvn package 打包 根据用户的配置,将项目打成 jar 包或者 war 包
    mvn install 安装 手动向本地仓库安装一个 jar
    mvn deploy 上传 将 jar 上传到私服

    如果想将 jar 上传到私服,那么就要构建 jar,就需要执行 package 命令,要打包,当然也需要测试,那就要走 mvn test 命令,要测试就要先编译.....,因此,最终所有的命令都会执行一遍。不过,开发者也可以手动配置不执行某一个命令,这就是跳过。一般来是,除了测试,其他步骤都不建议跳过。

    当然,如果使用了 IDEA ,这些命令不用手动敲,点一下就行:

    img

    Maven 依赖管理


    Maven 项目,如果需要使用第三方的控件,都是通过依赖管理来完成的。这里用到的一个东西就是 pom.xml 文件,概念叫做项目对象模型(POM,Project Object Model),我们在 pom.xml 中定义了 Maven 项目的形式,所以,pom.xml 相当于是 Maven 项目的一个地图。就类似于 web.xml 文件用来描述三大 web 组件一样。

    Maven 坐标

    <dependencies>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.11</version>
        <scope>test</scope>
      </dependency>
    </dependencies>
    
    • dependencies:在 dependencies 标签中,添加项目需要的 jar 所对应的 maven 坐标。

    • dependency:一个 dependency 标签表示一个坐标

    • groupId:团体、公司、组织机构等等的唯一标识。团体标识的约定是它以创建这个项目的组织名称的逆向域名(例如 org.javaboy)开头。一个 Maven 坐标必须要包含 groupId。一些典型的 groupId 如 apache 的 groupId 是 org.apache.

    • artifactId:artifactId 相当于在一个组织中项目的唯一标识符。

    • version:一个项目的版本。一个项目的话,可能会有多个版本。如果是正在开发的项目,我们可以给版本号加上一个 SNAPSHOT,表示这是一个快照版(新建项目的默认版本号就是快照版)

    • scope:表示依赖范围。

      img

      我们添加了很多依赖,但是不同依赖的使用范围是不一样的。最典型的有两个,一个是数据库驱动,另一个是单元测试。数据库驱动在使用的过程中,我们自己写代码,写的是 JDBC 代码,只有在项目运行时,才需要执行 MySQL 驱动中的代码。所以,MySQL 驱动这个依赖在添加到项目中之后,可以设置它的 scope 为 runtime,编译的时候不生效。而单元测试,只在测试的时候生效,所以可以设置它的 scope 为 test,这样,当项目打包发布时,单元测试的依赖就不会跟着发布。

    依赖冲突

    依赖冲突产生的原因

    img

    在图中,a.jar 依赖 b.jar,同时 a.jar 依赖 d.jar,这个时候,a 和 b、d 的关系是直接依赖的关系,a 和 c 的关系是间接依赖的关系。

    冲突解决

    1. 先定义先使用;
    2. 路径最近原则,优先级低的依赖优先使用。

    我们也可以手动控制。手动控制主要是通过排除依赖来实现,如下:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
        <exclusions>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-core</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    这个表示从 spring-context 中排除 spring-core 依赖。

    更多干货请移步:https://antoniopeng.com

  • 相关阅读:
    C# 中的委托和事件
    sql笔记-group by 统计功能
    js,css小知识点记录
    sql小技巧
    《孙子兵法》总结
    .Net深复制、浅复制
    《君主论》
    php邮箱找回密码功能
    后台管理员账号不能同时登陆,以及登陆使对方强制下线功能
    好程序员应该读的30本书
  • 原文地址:https://www.cnblogs.com/antoniopeng/p/14370695.html
Copyright © 2020-2023  润新知