美文网首页
87、【JavaEE】【Maven】Maven

87、【JavaEE】【Maven】Maven

作者: yscyber | 来源:发表于2021-10-01 04:27 被阅读0次

1、概述

  • Maven 官网:https://maven.apache.org

  • Maven 是一个跨平台的项目管理工具。作为 Apache 组织的一个颇为成功的开源项目,其主要服务于基于 Java 平台的项目创建,依赖管理和项目信息管理。Maven 自身是纯 Java 开发的。

  • Maven 的主要作用:

依赖管理:依赖指的就是是项目中需要使用的第三方 JAR 包。一个大一点的工程往往需要几十上百个 JAR 包,按照传统的方式,每使用一种 JAR,就需要导入到工程中,还要解决各种 JAR 包冲突的问题。Maven 可以对 JAR 包进行统一的管理,包括快速引入 JAR 包,以及对使用的 JAR 包进行统一的版本控制

项目结构标准化:Maven 提供了一个标准化的 Java 项目结构,可以通过 Maven 快速创建一个标准的 Java 项目。

2、Maven 安装与配置

3、Maven 仓库

  • “仓库”,简单说就是用来存放各种“依赖”(JAR 包)的地方。

  • Maven 仓库可以分为远程仓库、本地仓库。

  • Maven 工程在导入相关依赖的时候,Maven 会先到本地仓库中“寻找”,本地仓库中有的,便直接在当前 Maven 工程中使用;本地仓库中没有的,先从远程仓库中下载至本地仓库,然后使用。
    本地仓库的路径可以根据实际在配置文件中进行配置。

  • 远程仓库是指将依赖发布在网络上(可以是公共网络、也可以是内网),提供外界或内部使用。Maven 官方设立“中央仓库”并进行维护,“中央仓库”拥有最全的依赖(https://repo.maven.apache.org/maven2);一些团体通过建立对“中央仓库”镜像,形成可供特定人群便捷使用的远程仓库。
    远程仓库可以根据实际在配置文件中进行配置。

4、Maven 工程涉及的概念

  • Maven 工程(项目):多数情况指使用 Maven 创建的 Java 项目,具有较为统一、规范的结构(目录、配置文件等),后续的编译等操作自然也由 Maven 完成。

  • 依赖:工程所使用的第三方库称为“依赖”,查询依赖的网站:https://mvnrepository.com

  • 仓库:见上面的部分。

  • archetype(原型):Maven 预先提供的一些工程模板,便于快速创建工程。

  • GAV:G 指的是 GroupId,A 指的是 ArtifactId,V 指的是 Version,三者联合构成了 Maven 工程的唯一标识。Maven 工程中引入第三方依赖也是通过 GAV 的方式,所以也称 GAV 坐标。GroupId 一般是企业、团队的域名“倒写”,比如com.alibaba等;ArtifactId 可以理解是 Maven 工程的工程名,比如fastjson;Version 是版本号。

4、Maven 工程的结构

  • Maven 工程结构官方介绍:https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

  • 常见的 Maven 工程结构(Java Web 工程):

|---pom.xml
|---+src
|---------+main
|---------------+java
|---------------+resources
|---------------+webapp
|---------------------+WEB-INF
|-----------------------------web.xml
|---------+test
|---------------+java
|---+target

上述带“+”的表示“目录”,不带“+”的表示“文件”。
上述的结构以及名称一般不能随意更改。
webapp目录是使用 Maven 构建 Web 类型的工程时特有的。

pom.xml:是 Maven 工程的核心配置文件,每一个 Maven 工程有一个pom.xml文件。

src:源码
src/main/java:存放 Java 源码的目录
src/main/resources:存放配置文件的目录
src/main/webapp:存放 Web 资源的目录
src/test:存放测试代码的目录

target:项目构建(编译)后形成的目录

  • Maven 工程中,虽然划分出多个目录,但是这种“划分”是为了便于开发,工程(项目)经过构建(编译)后,所产生的目录与开发阶段是不同的。所以在编写代码的过程中,涉及到“文件的位置”的话,多数情况下应该按照“构建后“文件位置”。
    最为经典的:src/main/javasrc/main/resources,虽然开发时候是两个各自独立的目录,但是构建后,Maven 会自动将其“合并”至一个目录(“合并”意味着:如果src/main/javasrc/main/resources下面的子目录也一样,比如src/main/java/com/mycompany/app/App.javasrc/main/java/com/mycompany/app/mapper.xml,构建后,App.classmapper.xml会处在同一个目录中)。

类路径:类的源文件.java经过编译后形成的.class文件所在的路径。

4、使用 IDEA 创建 Maven 工程

  • IDEA 创建 Maven 工程之前,最好先全局性的配置 Maven。所谓“全局性”,就是通过 IDEA 关闭所有工程那个界面配置:
Maven-3 Maven-4
  • 可以使用 IDEA 直接创建 Maven Project:
Maven-5 Maven-6

5、Maven 工程中核心配置文件 — pom.xml

  • 每一个 Maven 工程都有一个pom.xml,作为核心配置文件。pom.xml主要的涵盖的配置内容有:工程的 GAV、工程构建后的形式、对工程所使用的依赖管理、使用的插件管理等。

  • pom.xmlpom的含义:Project Object Model

5.1、配置文件常用整体结构

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>······</groupId>
    <artifactId>······</artifactId>
    <version>······</version>
    <packaging>······</packaging>

    <properties>
         ······
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>······</dependency>
            <dependency>······</dependency>
            ······
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>······</dependency>
        <dependency>······</dependency>
         ······
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    ······
                </plugin>
                <plugin>
                    ······
                </plugin>
            </plugins>
        </pluginManagement>

        <plugins>
            <plugin>
                ······
            </plugin>
            <plugin>
                ······
            </plugin>
        </plugins>

        ······
    </build>

</project>

5.2、GAV

  • 配置文件中配置 Maven 工程的 GAV 坐标的是:
    <groupId>······</groupId>
    <artifactId>······</artifactId>
    <version>······</version>
  • GAV 一般是在创建工程的时候就已经确定的了,所以pom.xml中的一般不需要修改。

5.3、构建后形式

  • 一个 Maven 工程同样需要经过编译之后才能够使用、发布,因为 Maven 提供了“一条龙服务”,所以编译等操作自然也是由 Maven 完成。因为不同的工程最终应用场景是不同的,也就是编译后的“产物”也是不同的。在配置文件中,可以配置编译后的“产物”:
<packaging>war</packaging>
<packaging>jar</packaging>
<packaging>pom</packaging>
  • 严格意义上说,一个 Maven 工程编译后默认会形成一个target目录,而<packaging>标签配置的是“打包”的“产物”。这个“产物”是可以直接部署的。

  • 比较常见的“产物”是warjarpomwar是可以直接部署到 Java Web 服务器软件上的;打包成jar的话,就可以生产第三方库;pom更多使用在 Maven 工程聚合中。

5.4、依赖管理

  • 依赖管理可以说是 Maven 的最大用处之一。

  • pom.xml中与依赖管理有关的标签主要有:

    <dependencies>
        <dependency>······</dependency>
        <dependency>······</dependency>
         ······
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>······</dependency>
            <dependency>······</dependency>
            ······
        </dependencies>
    </dependencyManagement>
  • 导入依赖:导入依赖使用的是<dependencies>标签,在这个标签下,再使用<dependency>标签,一个<dependency>标签表示一个依赖:
<!-- 一个“依赖”单元,使用 <dependency> 标签,其中包裹依赖的 GAV -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
<!-- 导入“依赖”,在 <dependencies> 标签中包裹“依赖”单元  -->

    <dependencies>

        ······

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>

        ······

    <dependencies>
  • “依赖”单元<dependency>中的常用标签:

<groupId>:GroupId,GAV 中的 G,必要标签
<artifactId>:ArtifactId,GAV 中的 A,必要标签
<version>:version,版本,GAV 中的 V,必要标签
<scope>:该依赖作用域,可选标签,常见的有providedtestcompile等。

compile:默认作用域(当没有<scope>标签时)。compile表示依赖需要参与当前项目的编译,当然后续的测试,运行周期也参与其中。打包的时候通常需要包含进去。

provided:意味着打包的时候可以不用包进去,别的设施(Web Container)会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是在打包阶段做了exclude(排除)的动作。

test:表示依赖仅仅参与测试相关的工作,打包阶段也是exclude(排除),典型的如 Junit。

  • <dependencyManagement>可以实现对依赖的“版本控制”。
<!-- 在 <dependencyManagement> 中声明依赖 -->
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
<!-- 统一声明版本等信息 -->
                <version>4.0.1</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>javax.servlet.jsp</groupId>
                <artifactId>javax.servlet.jsp-api</artifactId>
                <version>2.3.3</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

<!-- 正式导入依赖 -->
    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
<!-- 只需 GA,无需再写其他的,因为上面已经对依赖进行了完整的声明 -->
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
        </dependency>
    </dependencies>

<dependencyManagement>标签中包括<dependencies>标签,但是在<dependencyManagement>标签中不代表导入依赖,真正导入依赖需要在与<dependencyManagement>标签同级的<dependencies>标签下。

<dependencyManagement>标签中是对依赖进行声明,这个声明中所使用的依赖单元(<dependency>)是完整的,GAV 和其他的一些标签该写的都写上。声明之后,在正式导入依赖的时候,依赖单元中,只需写 GA 即可。

5.5、插件管理

5.6、其他

6、Maven 常用命令

7、其他

  • 与 Maven 类似项目管理工具的,还有 Gradle(https://gradle.org);
    在当前的前端领域,也有类似于 Maven、Gradle 的 npm 等,前端的开发模式也与后端越来越像。

相关文章

  • 87、【JavaEE】【Maven】Maven

    1、概述 Maven 官网:https://maven.apache.org Maven 是一个跨平台的项目管理工...

  • Maven

    Maven是项目管理的Java工具,JavaEE中使用Maven可以方便地管理团队合作项目,可使用Maven管理类...

  • JAVAEE管理——Maven

    Maven简介 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Maven好处 ...

  • JAVAEE管理——Maven

    Maven简介 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Maven好处 ...

  • 第二轮代课的目标

    这是第二乱完整的代课。这次的目标是:完善JAVAEE的课程。 1. 增加maven的使用。 2. 夯实JAVAEE...

  • IDEA 使用JPA快速将表转换为实体类

    1.引入 javaee maven 依赖,scope填写provided 否则会包冲突 2.在项目配置 modul...

  • 18.maven

    1.什么是maven? 自动化构建项目工具 javaEE 经历了一些了变化 Make -> Ant -> Mav...

  • Maven - pom.xml 文件

    章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven ...

  • Maven - 简介

    章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven ...

  • Maven - 工作原理

    章节 Maven – 简介 Maven – 工作原理 Maven – Repository(存储库) Maven ...

网友评论

      本文标题:87、【JavaEE】【Maven】Maven

      本文链接:https://www.haomeiwen.com/subject/drxdnltx.html