基础教程,读完这篇就够了

2019-12-05 07:14 来源:未知

image.png

何为Maven坐标

是Maven定义的一组规则,世界上任何一个构建都可以使用Maven坐标唯一标识,Maven坐标的元素包括groupId,artifactId,version,packging,classifier。只需要提供正确的坐标信息,Maven就能找到对应的构建。

简介

前言

夜空中最亮的星,2018请照亮我前行~ Maven是我们日常开发都会用到的,新年第一天,把看过的Maven基础概念做了整理,作为入门和查阅使用。

坐标详解

坐标定义例子:

<groupId>org.sonatype.nexus</groupId>
<artifactId>nexus-indexer</artifactId>
<version>2.0.0</version>
<packaging>jar</packaging>

groupId:定义当前Maven项目隶属于的实际项目
artifactId:该元素定义实际项目中的一个Maven项目(模块),推荐的做法是使用实际项目名称作为artifactId的前缀
version:该元素定义Maven项目当前所处的版本
packaging:该元素定义Maven项目的打包方式
classifier:该元素用来帮助定义构建输出的一些附属构建

概述

  • Maven 是一个项目管理和整合工具
  • Maven 为开发者提供了一套完整的构建生命周期框架
  • Maven 简化了工程的构建过程,并对其标准化,它无缝衔接了编译、发布、文档生成、团队合作和其他任务

正文

依赖详解

  1. type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,默认值为jar
  2. 依赖范围:依赖范围就是用来控制依赖与这三种classpath(编译classpath,测试classpath,运行classpath)的关系,Maven有以下几种依赖范围:
    2.1 compile:编译测试范围。如果没有指定,就会默认使用该依赖范围。使用此依赖的Maven依赖,对于编译,测试,运行三种classpath都有效
    2.2 test:测试依赖范围,此依赖只对测试classpath有效
    2.3 provided:已提供依赖范围,此依赖范围对编译和测试classpath有效
    2.4 runtime:运行时依赖范围,此依赖对于测试和运行有效
    2.5 system:系统依赖范围,依赖范围和provided完全一致,但是使用此依赖时必须通过systemPath元素显示的指定依赖文件的路径,代码示例如下:
<dependency>
  <groupId>java.sql</groupId>
  <artifactId>jdbc-stdext</artifactId>
  <version>2.0</version>
  <scope>system</scope>
  <systemPath>${java.home}/lib/rt.jar</systemPath>
</dependency>
  1. 传递性依赖和依赖范围
    第一直接依赖的范围和第二直接依赖的范围决定了传递性依赖的范围。如下表所示,最左边一列表示第一直接依赖范围,最上面一行表示第二直接依赖范围,中间的交叉单元格则表示传递性依赖范围:
compile test provided runtime
compile compile -- -- runtime
test test -- -- test
provided provided -- provided provided
runtime runtime -- -- runtime

为了帮助理解,举个例子:account-email项目有一个com.icegreen:greenmail:1.3.1b的直接依赖我们说这是第一直接依赖,其依赖范围是test;而greenmail又有一个javax.mail:mail:1.4的直接依赖,我们说这是第二直接依赖,其依赖范围为compile。显然,javax.mail:mail:1.4是account-email的传递性依赖,对照表可以知道,当第一直接依赖范围为test,第二直接依赖范围是compile的时候,传递性依赖范围是test,因此,javax.mail:mail:1.4是account-email的一个范围是test的传递性依赖

环境配置

Maven概念

Maven作为一个构建工具,不仅能帮我们自动化构建,还能够抽象构建过程,提供构建任务实现;它跨平台,对外提供了一致的操作接口,这一切足以使它成为优秀的、流行的构建工具。

Maven不仅是构建工具,还是一个依赖管理工具和项目管理工具,它提供了中央仓库,能帮我自动下载构件。

依赖操作

  1. 依赖调解,当传递性依赖造成问题的时候,我们就需要清楚的知道该传递性依赖时从那条依赖路径引入的
    Maven调解的两大原则:
    1.1 路径最近者优先
    1.2 第一声明者优先,顺序最靠前的那个依赖优胜

  2. 可选依赖使用<optional>元素表示依赖为可选依赖,当依赖为可选依赖时,该依赖只对本项目产生影响,如若别的项目依赖本项目,不会依赖本项目的可选依赖。使用可选依赖的原因是某一个项目实现了多个特性,在面向对象设计中,有个单一职责型原则,意指一个类应该只有一项职责,而不是糅合太多的功能

  3. 排除依赖
    假想情况:当前项目有一个第三方依赖,而这个第三方依赖由于某些原因依赖了另外一个类库的SNAPSHOP版本,那么这个SNAPSHOP就会成为当前项目的传递性依赖,而SNAPSHOP的不稳定性会直接影响到当前项目,这时候就需要排除掉该SNAPSHOP,并且在当前项目中声明该类库的某个正式的发布版本
    解决方法:代码中使用exclusions元素声明排除依赖,exclusions可以包含一个或者多个exclusions子元素,因此可次排除一个或者多个传递性依赖
    代码示例如下:

 <dependency>
  <groupId>com.juvenxu.mvnbook</groupId>
  <artifactId>project-b</artifactId>
  <version>1.0.0</version>
  <exclusions>
    <exclusion>
      <groupId>com.juvenxu.mvnbook</groupId>
      <artifactId>project-c</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  1. 优化依赖
    4.1 mvn dependency:list,查看当前项目的已解析依赖
    4.2 mvn dependency:tree,查看当前项目的依赖树
    使用上面两个命令可以帮助我们详细了解项目中所有依赖的具体信息,在此基础上,还有dependency:analyze工具可以帮助分析当前项目的依赖
    注:最好是显示的声明任何项目中直接用到的依赖

系统要求

  • JDK
    • Maven 3.3 要求 JDK 1.7 或以上
    • Maven 3.2 要求 JDK 1.6 或以上
    • Maven 3.0/3.1 要求 JDK 1.5 或以上
  • 磁盘
        Maven自身安装需要大约 10 MB 空间。除此之外,额外的磁盘空间将用于你的本地 Maven 仓库。你本地仓库的大小取决于使用情况,但预期至少 500 MB。
  • 内存
        没有最低要求。
  • 操作系统
        没有最低要求。

maven的安装

一:因为本人是window系统,所以这里只介绍window下如何安装,在安装Maven之前,先确认已经安装了JDK.

image.png

二:接着去Maven官网下载界面下载想要的版本解压到你想要的目录就行

image.png

image.png

三:最后设置一下环境变量,将Maven安装配置到操作系统环境中,主要就是配置M2_HOMEPATH两项,如图

image.png

都搞定后,验证一下,打开doc输入 mvn -v如何得到下面信息就说明配置成功了

image.png

仓库的分类

  1. 本地仓库
    不管Linux还是Windows上,每个用户在自己的目录下都有一个路径名为.m2/respository/的仓库目录。以.开头的文件或目录默认是隐藏的,可以使用ls-a命令显示隐藏文件或目录
    有时候,用户会想要自定义本地仓库目录地址,可以编辑文件~/.m2/settings.xml,设置localRepository元素的值为想要的仓库地址
    Install插件的install目标将项目的构建输出文件安装到本地仓库

  2. 私服
    私服是一种特殊的远程仓库,为了节省宽带和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。内部的项目还能部署到私服上供其它项目使用,一些无法外部仓库下载到的构件也能从本地上传到私服上供大家使用。
    私服主要的作用有: 节省自己的外网宽带,加速Maven构建,部署第三方构建,提高稳定性,增强控制,降低中央仓库的负荷

Java安装

  • Windows
        打开命令控制台,输入:java -version;输出:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

    如果没有安装自行安装,并配置环境变量。

  • Linux
        打开命令终端,输入:java -version;输出:
 java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

    如果没有安装自行安装,并配置环境变量

  • Mac
        打开命令终端,输入:java -version;输出:
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) Client VM (build 25.131-b11, mixed mode, sharing)

    如果没有安装自行安装,并配置环境变量

maven目录

image.png

  • bin目录
    该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
  • boot目录:
    该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。
  • conf目录:
    该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为,一般情况下,我们更偏向于复制该文件至/.m2/目录下(表示用户目录),然后修改该文件,在用户范围定制Maven的行为。
  • lib目录:
    该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。

远程仓库的配置

  1. 在respository元素下,可以使用respository子元素声明一个或者多个远程仓库
  2. 对于releases和snapshots来说,除了enabled,塔门还包含另外两个子元素uodatePolicy和checksumPolicy
    2.1 updatePolicy:配置Maven从远程仓库检查更新的频率
    2.2 checksumPolicy:配置Maven检查检验和文件的策略
    2.3 代码示例:
<snapshots>
 <enabled>true</enabled>
 <updatePolicy>daily</updatePolicy>
 <checksumPolicy>ignore</checksumPolicy>
</snapshots>
  1. 远程仓库的认证需要在settings.xml中配置用户名和密码
<servers>
  <server>
    <id>my-proj</id>
    <username>repo-user</username>
    <password>repo-pwd</password>
  </server>
</servers>
  1. 部署至远程仓库,distributionManagement包含repository和snapshotRepository子元素,前者表示发布版本构建的仓库,后者表示快照版本的仓库。id为该远程仓库的唯一标识,name是为了方便人阅读,关键的url表示该仓库的地址,部署到配置的远程仓库命令是mvn clean deploy
<distributionManagement>
  <repository>
    <id></id>
    <name></name>
    <url></url>
  </repository>
  <snapshotRepository>
    <id></id>
    <name></name>
    <url></url>
  </snapshotRepository>
</distributionManagement>

文章仅供参考,代码并不是全正确,只需要知道在对应的情况,可以做对应的处理,代码是变化的,我相信原理不变


Maven安装

  • 下载安装文件,选择最新稳定版本:http://maven.apache.org/download.html
  • 安装
    • Windows:解压文件到你想要安装的位置:D:Softwareapache-maven-3.5.0
    • Linux:解压文件到你想要安装的位置:/usr/local/apache-maven
    • Mac:解压文件到你想要安装的位置:/usr/local/apache-maven
  • 设置 Maven 环境变量(不清楚的自行查找资料)
    • Windows
      配置M2_HOME环境变量:
      M2_HOME=D:Softwareapache-maven-3.5.0;
      将bin目录追加到PATH路径中:%M2_HOME%bin;
    • Linux
      在/etc/profile文件中添加Maven环境变量,如下所示:
      export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
      export PATH=$M2_HOME/bin:$PATH
      然后执行source /etc/profile,使环境变量生效
    • Mac
      在/etc/profile文件中添加Maven环境变量,如下所示:
      export M2_HOME=/usr/local/apache-maven/apache-maven-3.5.0
      export PATH=$M2_HOME/bin:$PATH
      然后执行source /etc/profile,使环境变量生效
    • 验证 Maven 安装(有输出maven版本信息,Java版本信息表示安装成功)
      • Windows : mvn --version
      • Linux : mvn --version
      • Mac : mvn --version

Maven常用命令说明

mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
mvn clean test:运行清理和测试。
mvn clean package:运行清理和打包。
mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
mvn clean deploy:运行清理和发布(发布到私服上面)。

上面的命令大部分都是连写的,大家也可以拆分分别执行,这是活的,看个人喜好以及使用需求,Eclipse Run as对maven项目会提供常用的命令。

功能

  • 项目管理工具
  • 依赖管理工具
  • 构建工具

设置http代理

编辑seeting.xml文件
有时候你所在的公司基于安全因素考虑,要求你使用通过安全认证的代理访问因特网。这种情况下,就需要为Maven配置HTTP代理,才能让它正常访问外部仓库,以下载所需要的资源。首先确认自己无法直接访问公共的maven中央仓库,直接运行命令ping repo1.maven.org可以检查网络。如果真的需要代理,先检查一下代理服务器是否畅通。比如现在有一个IP地址为218.14.227.197,端口为3128的代理服务,我们可以运行telnet 218.14.227.197 3128来检测该地址的该端口是否畅通。如果得到出错信息,需要先获取正确的代理服务信息,如果telnet连接正确,则输入ctrl+],然后q,回车,退出即可。

检查完毕之后,编辑~/.m2/settings.xml文件(如果没有该文件,则复制$M2_HOME/conf/settings.xml)。添加代理配置如下:

<settings>  
  ...  
  <proxies>  
    <proxy>  
      <id>my-proxy</id>  
      <active>true</active>  
      <protocol>http</protocol>  
      <host>218.14.227.197</host>  
      <port>3128</port>  
      <!--  
        <username>***</username>  
        <password>***</password>  
        <nonProxyHosts>  
          repository.mycom.com|*.google.com  
        </nonProxyHosts>  
      -->  
    </proxy>  
  </proxies>  
  ...  
</settings> 

这段配置十分简单,proxies下可以有多个proxy元素,如果声明了多个proxy元素,则默认情况下第一个被激活的proxy会生效。这里声明了一个id为my-proxy的代理,active的值为true表示激活该代理,protocol表示使用的代理协议,这里是http。当然,最重要的是指定正确的主机名(host元素)和端口(port元素)。上述xml配置中注释掉了username,password,nonProxyHosts几个元素。当代理服务需要认证时,就需要配置username和password。nonProxyHost元素用来指定哪些主机不需要代理,可以使用"|"符号来分隔多个主机名。此外,该配置也支持通配符,如:*.google.com表示所有以google.com结尾的域名访问都不要通过代理。

优点

  • 对第三方依赖库进行了统一的版本管理
  • 统一了构建过程
  • 统一了项目的目录结构

Maven插件安装,基于IDEA

博主现在使用IDEA来开发的,所以这里介绍一下IDEA中如何配置引入我们上面下载好的Maven

image.png

构建

  • 清理 : mvn clear
  • 编译 : mvn compile
  • 测试 : mvn test
  • 打包 : mvn package
  • 部署 : mvn deploy
  • 安装(将jar安装到本地仓库): mvn install

Maven使用

<?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>com.tengj</groupId>
    <artifactId>springBootDemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springBootDemo1</name>
</project>

代码的第一行是XML头,指定了该xml文档的版本和编码方式。
project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素。
根元素下的第一个子元素modelVersion指定了当前的POM模型的版本,对于Maven3来说,它只能是4.0.0
代码中最重要是包含了groupId,artifactId和version了。这三个元素定义了一个项目基本的坐标,在Maven的世界,任何的jar、pom或者jar都是以基于这些基本的坐标进行区分的。

groupId定义了项目属于哪个组,随意命名,比如谷歌公司的myapp项目,就取名为 com.google.myapp

artifactId定义了当前Maven项目在组中唯一的ID,比如定义hello-world。

version指定了项目当前的版本0.0.1-SNAPSHOT,SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的。

name元素生命了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个POM声明name,以方便信息交流

使用入门

依赖的配置

<project>
...
<dependencies>
    <dependency>
        <groupId>实际项目</groupId>
     <artifactId>模块</artifactId>
     <version>版本</version>
     <type>依赖类型</type>
     <scope>依赖范围</scope>
     <optional>依赖是否可选</optional>
     <!—主要用于排除传递性依赖-->
     <exclusions>
         <exclusion>
           <groupId>…</groupId>
          <artifactId>…</artifactId>
       </exclusion>
     </exclusions>
  </dependency>
<dependencies>
...
</project>

根元素project下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个项目依赖。每个依赖可以包含的元素有:

  • grounpId、artifactId和version:以来的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
  • type:依赖的类型,对于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值为jar
  • scope:依赖的范围
  • optional:标记依赖是否可选
  • exclusions:用来排除传递性依赖

约定优于配置

    Maven 规定了项目的源代码,测试代码,资源文件,编译包输出文件,字节码文件等文件的目录,统一了项目的目录结构

  • 源代码目录 : /src/main/java
  • 资源文件目录 : /src/main/resources
  • 测试代码目录 : /src/test/java
  • 包输出目录 : /target
  • 编译后的字节码输出目录 : /target/classes
TAG标签:
版权声明:本文由金沙澳门官网4166发布于世界史,转载请注明出处:基础教程,读完这篇就够了