速览 - 目录
groupId && artifactId && version
希望我们可以在时间的流逝中, 抓住时间的缝隙, 不断成长. (●'◡'●)
来由
在企业级应用开发中, 往往都需要使用到很多的第三方的类库, 例如我们常用到的单元测试框架junit, 日志框架slf4j, 还有一些常用的工具类库.
到了后期, 项目的规模大了之后, 管理的第三方类库就会越多, 类库数量众多, 并且还存在着类库依赖类库的这种错综复杂的情况. 让项目的管理变得非常繁琐.
如何管理这些类库就成了一个非常大的问题: 前期需要大量的时间和精力去处理好这些第三方库, 引用这些库, 而且一旦缺少某些jar包, 就会编译失败.
Maven横空出世, maven通过一小段的标记语言(xml), 来描述整个项目结构和依赖.
前世今生(了解即可)
- 创始人及起源:
- Maven的创始人是Jason Van Zyl。
- Maven起源于Jakarta Alexandria项目,并在2002年10月左右迁移到Turbine项目中继续发展。
- 发展背景:
- Jason Van Zyl发现了一种更好的项目管理方式,即在一个地方可以查找属于这个项目的所有内容,包括一个标准的目录结构,以便不必在库、资源和文档中到处寻找。
- 基于这种思想,Jason Van Zyl发明了Maven,用于简化项目的建设和管理。
- 发展历程:
- Maven发展至今,经历了三代:Maven 1、Maven 2和Maven 3。
- 每一代Maven都带来了不令人兴奋但功能特性上的改进和增强。
- 功能特性:
- Maven提供了一个简单的构建框架,支持对项目进行编译、测试和部署。
- 它主要解决了Java项目构建过程中的一些基本问题,如依赖管理、自动化编译和标准化构建流程等。
- 社区发展:
- 随着Java生态系统的不断发展,越来越多的开发者开始关注和使用Maven。
- Maven社区迅速发展壮大,涌现出了大量的插件和扩展,覆盖了从项目构建、测试、部署到文档生成等各个方面。
- 一些大型开源项目也开始采用Maven作为其构建和管理工具。
- 标准与自动化:
- 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>
定义了项目的打包方式,常见的值有jar
、war
等。<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 Mavenhttps://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/https://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的一个简单的日志实现.
了解即可
解释如下: