Maven

速览 - 目录

来由

前世今生(了解即可) 

Maven的本质

什么是Maven

项目对象模型

下载安装Maven

maven基本概念 

仓库 

 坐标

仓库配置

日志配置

本地maven配置

​编辑

 xml文件

 settings.xml配置文件

配置本地仓库

Maven工程目录的结构

project

modelVersion

groupId && artifactId && version

packaging

name

description

 url

 dependencies

modules && module

build

developers && developer

Maven的构建过程和生命周期

mvn指令

指令基础

快速构建maven项目

构建生命周期

compile 

test 

test-compile

package

install

clean

如何使用插件 

疑难解答

将resources添加到jar包

如何添加资源过滤器

如何使用外部依赖

如何将jar推送到远程仓库


希望我们可以在时间的流逝中, 抓住时间的缝隙, 不断成长. ('◡')


来由

        在企业级应用开发中, 往往都需要使用到很多的第三方的类库, 例如我们常用到的单元测试框架junit, 日志框架slf4j, 还有一些常用的工具类库. 

        到了后期, 项目的规模大了之后, 管理的第三方类库就会越多, 类库数量众多, 并且还存在着类库依赖类库的这种错综复杂的情况. 让项目的管理变得非常繁琐.

        如何管理这些类库就成了一个非常大的问题: 前期需要大量的时间和精力去处理好这些第三方库, 引用这些库, 而且一旦缺少某些jar包, 就会编译失败.

        Maven横空出世, maven通过一小段的标记语言(xml), 来描述整个项目结构和依赖.

前世今生(了解即可) 

  1. 创始人及起源
    • Maven的创始人是Jason Van Zyl。
    • Maven起源于Jakarta Alexandria项目,并在2002年10月左右迁移到Turbine项目中继续发展。
  2. 发展背景
    • Jason Van Zyl发现了一种更好的项目管理方式,即在一个地方可以查找属于这个项目的所有内容,包括一个标准的目录结构,以便不必在库、资源和文档中到处寻找。
    • 基于这种思想,Jason Van Zyl发明了Maven,用于简化项目的建设和管理。
  3. 发展历程
    • Maven发展至今,经历了三代:Maven 1、Maven 2和Maven 3。
    • 每一代Maven都带来了不令人兴奋但功能特性上的改进和增强。
  4. 功能特性
    • Maven提供了一个简单的构建框架,支持对项目进行编译、测试和部署。
    • 它主要解决了Java项目构建过程中的一些基本问题,如依赖管理、自动化编译和标准化构建流程等。
  5. 社区发展
    • 随着Java生态系统的不断发展,越来越多的开发者开始关注和使用Maven。
    • Maven社区迅速发展壮大,涌现出了大量的插件和扩展,覆盖了从项目构建、测试、部署到文档生成等各个方面。
    • 一些大型开源项目也开始采用Maven作为其构建和管理工具。
  6. 标准与自动化
    • Maven遵循一套标准的项目结构,如Maven目录结构,这有利于团队协作和项目管理。
    • 通过坐标定位的方式,Maven能够自动下载和管理项目所需的依赖库,提高了项目的开发效率和可维护性。

为什么他叫maven

Maven这个单词来自于意第绪语犹太语),意为知识的积累,最初在Jakata Turbine项目中用来简化构建过程。当时有一些项目(有各自Ant build文件),仅有细微的差别,而JAR文件都由CVS来维护。于是希望有一种标准化的方式构建项目,一个清晰的方式定义项目的组成,一个容易的方式发布项目的信息,以及一种简单的方式在多个项目中共享JARs。

现在最常用的版本就是maven3

说了那么多, 你也大概知道maven是干嘛的了,

Maven的本质

什么是Maven

        Maven本质就是一个项目管理工具, 刚才也说过, maven是使用一种标记语言, 来描述和管理对象, 这个语言就是xml, Maven是纯java代码编写的, 所以在使用的时候, 需要安装java运行环境, 并且Maven本身这个项目的构建, 也是基于java的面向对象的特性, 具体面向对象的特性就体现在我们常用的一个文件上, 也就是pom.xml这个文件.

        下面是一个pom.xml文件的样例, 看完这个案例你就会理解, 为什么是面向对象特性: 

<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>com.example</groupId>  
    <artifactId>my-project</artifactId>  
    <version>1.0-SNAPSHOT</version>  
    <packaging>jar</packaging>  
  
    <!-- 项目名称和URL(可选) -->  
    <name>My Project</name>  
    <url>http://maven.apache.org</url>  
  
    <!-- 开发者信息(可选) -->  
    <developers>  
        <developer>  
            <id>your-id</id>  
            <name>Your Name</name>  
            <email>your-email@example.com</email>  
        </developer>  
    </developers>  
  
    <!-- 项目依赖(可选) -->  
    <dependencies>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.13.2</version>  
            <scope>test</scope>  
        </dependency>  
        <!-- 添加其他依赖 -->  
    </dependencies>  
  
    <!-- 构建配置(可选) -->  
    <build>  
        <plugins>  
            <!-- 添加构建插件 -->  
        </plugins>  
    </build>  
  
    <!-- 其他配置,如属性、仓库等(可选) -->  
    <properties>  
        <!-- 定义属性 -->  
    </properties>  
  
    <repositories>  
        <!-- 定义仓库 -->  
    </repositories>  
  
    <!-- 其他POM元素,如profiles、modules等 -->  
  
</project>

把上面的内容都过一遍, 下面我们来尝试描述这些标签的含义是什么... 

  • <groupId><artifactId> 和 <version> 是 Maven 项目的坐标,用于唯一标识项目, 后面会讲
  • <packaging> 定义了项目的打包方式,常见的值有 jarwar 等。
  • <dependencies> 元素用于定义项目的依赖。
  • <build> 元素包含了构建相关的配置,如插件定义。
  • <properties> 元素用于定义属性,这些属性可以在 POM 的其他部分使用。
  • <repositories> 元素用于定义项目依赖的仓库位置。

这些现在了解即可, 后面会讲解.

面向对象性质

        这个文件是由一个project标签开始, 它是整个xml文件的根标签,  代表着这个项目, 项目里面则可以定义的基本开发信息, 开发者信息, 以及所选的依赖和插件, 他们都是在project的子标签中定义, 这样就有了一个类似于树形结构的样式,, 当然你也可以理解为这些(标红处)是这个xml文件的属性, 而xml文件的本身就可以看做是一个类.

项目对象模型

        在了解了这些基本特性之后, 就大概有了一个初步的认识, 从上述描述和代码案例中, 通过这个pom.xml来构建一个项目对象模型, 然后第三方类库的信息, 都放在dependency中, 如下: 

<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>  
  
    <!-- ... 此处省略了一些标签  -->
  
    <!-- 项目依赖(可选) -->  
    <dependencies>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.13.2</version>  
            <scope>test</scope>  
        </dependency>  
        <!-- 添加其他依赖 -->  
    </dependencies>  

    <!-- ... 此处省略了一些标签  -->
</project>

        我们提到过, 这只是一个xml文件的, 里面的dependency再怎么样, 也只不过是一堆代码, 几十个字符, 他难道能是对应的依赖文件吗? 当然不是, 它仅仅只是做了一个标记, 标记你要用到的使什么依赖, 然后到特定的位置去引用对应的jar包.

        下图是pom模型的一个图解: 

        下面是一个依赖的描述: 

        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.13.2</version>  
            <scope>test</scope>  
        </dependency>  

        其中: 

  • groupId  :  :定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis
  • artifactld : 定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
  • version : 定义当前项目版本号

        了解即可.

下载安装Maven

纯绿色软件, 下载解压即可使用

纯绿色软件, 下载解压即可使用

纯绿色软件, 下载解压即可使用

        maven是由阿帕奇软件基金会维护的一个项目, 直接去官网下载即可: 

Maven – Welcome to Apache Mavenicon-default.png?t=N7T8https://maven.apache.org/

        点击download, 跳转到下载页面 , 下载对应的版本即可(在使用maven之前你应该安装java运行环境, 注意maven和当前java的版本相匹配) : 

         解压之后的文件目录结构如下:

         其中: 

  • bin目录:包含Maven的可执行文件,如mvn(Maven命令行工具)和mvnDebug(用于调试的Maven命令行工具)。这些文件是用户与Maven进行交互的主要方式。
  • boot目录:包含Maven自身的类加载器所需的jar包和配置文件。这些文件用于加载Maven运行时的类库。之前也说过, maven本身也是由java写的, 本身也依赖了很多三方库.
  • conf目录:所见即所得, 也就是配置文件, 包含Maven的配置文件,主要是settings.xml。这个文件用于配置Maven的全局设置,如代理设置、仓库地址等。
  • lib目录:包含Maven运行所依赖的jar包。这些jar包是Maven自身的组成部分,用于提供Maven的各种功能。

检查是否安装成功: 

        如果你配置了maven的环境变量的话, 直接win + r 输入cmd, 打开然后输入mvn看看有没有对应的提示信息: 如果你不想配置环境变量的话,你可以直接在maven的bin目录中cmd, 然后输入mvn:

maven基本概念 

仓库 

        之前我们说过, 我们使用maven管理项目的时候, 需要首先在项目对象模型的文件中(pom.xml)引入对应的依赖, 那么它终究只是引入, 如下代码, 而不是真正的jar包, 那么真正的jar包放在那里呢? 

<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>  
  
    <!-- ... 此处省略了一些标签  -->
  
    <!-- 项目依赖(可选) -->  
    <dependencies>  
        <dependency>  
            <groupId>junit</groupId>  
            <artifactId>junit</artifactId>  
            <version>4.13.2</version>  
            <scope>test</scope>  
        </dependency>  
        <!-- 添加其他依赖 -->  
    </dependencies>  

    <!-- ... 此处省略了一些标签  -->
</project>

         你可能会想到, 我直接存储在本地啊, 我在pom文件中, 要用到什么依赖, 我就引入什么依赖, 然后要用到这个依赖的jar包的时候, 我从本地的存储里面去找不就行了, 确实, 但是你本地的存储的jar包又是哪来的呢? 当然有几种方法: 

  • 第一种就是, 你在网上下载很多jar包, 例如spring官网去下载springframework的核心jar包, 或者是其他的jar包, 下载好之后, 通过maven的某些加载命令(mvn install:install-file), 然后指定一些参数, 以便后续方便引用这个jar包.

        下面是安装自己在网上下载的jar包到本地maven仓库的命令案例: 

mvn install:install-file -Dfile=path/to/your/downloaded.jar \  
  -DgroupId=com.example \  
  -DartifactId=my-library \  
  -Dversion=1.0.0 \  
  -Dpackaging=jar

        为什么要定义什么groupId, artifactId, 还有什.么version啊? 这是因为, 无论是本地的仓库, 还是远程的仓库, 都存在很多jar包, 你可以一次性引用很多个jar包, 但是为了对这些资源进行区分, 我们需要给他一个类似于"主键"的东西, 让我们可以通过这个 "主键" 可以找到唯一的那个jar包

        但是由于不同的jar包, 是由不同的公司或者组织开发的, 所以为了区分这些组织, 也就有了groupId这个属性, 这个属性通常是公司域名的反写形式, 例如spring框架的依赖通常是 org.springframework, artifactId就是你这个jar包的名字, version顾名思义就是版本的意思.

  • 第二种就是, 手动下载jar包区安装, 就有点违背我们使用maven的初心了, maven真的是好人做到底了, 为了防止不同的人按照上述的install来安装jar包, 同一个jar包使用不同命名的情况出现, 例如有的人下载spring的依赖之后, install的时候, 给的groupid为org.springframework, 但是有的人就会想, 我为什么要写org啊, 我少写两个省事不行吗.

        于是为了防止这种情况, maven就维护了一个中央网站, 让大家都在这个网站里面下载jar包, 这些jar包是直接下载到你的maven本地仓库, 无需maven installfile的命令, 并且这些jar包的groupid和artifactId还有version都是已经命名好的, 避免同一个jar包不同的命名这种不方便管理和可读性差的情况.

        但是存在另外一种情况, 因为中央仓库的地址: https://mvnrepository.com/icon-default.png?t=N7T8https://mvnrepository.com/         他是部署在国外的服务器上, 因此在访问上多多少少不如国内, 于是为了处理这种情况, 就可以在本地仓库和中央仓库之间再部署一个服务器, 让这个服务器去专门访问这个中央仓库, 本将jar包下载到本地供给本地仓库下载.

        这个服务器就叫做私服, 私服的作用如下: 

        但是这样还是不够, 因为这样的话, 还是从国外的网站下载, 于是国内的一些公司就开发了自己的maven仓库资源的镜像源, 来方便我们下载.

        同时一些公司开发的好用的jar包是不能直接上传到maven的, 因为别人是可以直接下载到的. 这可能就会出现后期的一些法律上的纠纷.

        中央仓库是由maven团队直接维护的, 是存储所有的资源的仓库.

 坐标

        上面提到过, 坐标就是用于定位中央仓库中资源的位置, 他有如下要素:

  • groupld:定义当前Maven项目隶属组织名称(通常是域名反写,例如:org.mybatis)
  • artifactld:定义当前Maven项目名称(通常是模块名称,例如CRM、SMS)
  • version:定义当前项目版本号

使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

这里不再赘述.

仓库配置

        Maven中有很多配置文件, 例如本地仓库的位置, 自定义仓库位置的设置, 此外我们中央仓库下载的位置, 也是可以配置的, 例如你们在下载的时候, 如果你下载的是国外的中央仓库, 如果不挂vpn, 那么就会出现下载速度慢的情况, 这个时候你就可以配置下载地址, 比如配置为国内的阿里镜像云.

        配置文件在什么位置?

        conf, 顾名思义就是配置文件的意思.

  •  logging : 也就是日志配置文件, 里面有一个配置文件如下: 

日志配置

        打开它: 

# 本文件名为: simplelogger.properties

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

org.slf4j.simpleLogger.defaultLogLevel=info
org.slf4j.simpleLogger.showDateTime=false
org.slf4j.simpleLogger.showThreadName=false
org.slf4j.simpleLogger.showLogName=false
org.slf4j.simpleLogger.logFile=System.out
org.slf4j.simpleLogger.cacheOutputStream=true
org.slf4j.simpleLogger.levelInBrackets=true
org.slf4j.simpleLogger.log.Sisu=info
org.slf4j.simpleLogger.warnLevelString=WARNING

# MNG-6181: mvn -X also prints all debug logging from HttpClient
# Be aware that the shaded packages are used
# org.apache.http -> org.apache.maven.wagon.providers.http.httpclient
org.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient=off
org.slf4j.simpleLogger.log.org.apache.maven.wagon.providers.http.httpclient.wire=off

        这是一个用于配置slf4j的一个SimpleLogger实现, slf4j 是一个用于java 的简单日志门面, 它允许用户在运行时候将任何支持的日志框架,  例如 logback log4j等, 插入到应用中, 这个simpleLogger是slf4j的一个简单的日志实现.

了解即可

 解释如下: 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值