美文网首页maven工作2017届西安思沃大讲堂
Maven指南(一) - 两小时从零到了解

Maven指南(一) - 两小时从零到了解

作者: 司鑫 | 来源:发表于2017-01-17 16:30 被阅读1700次
目录导航,方便大家选择性查看

1 Maven 介绍


是什么

Maven是一个项目管理工具,它包含一个目标对象模型POM(project Object Model),一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System)和用来运行定义在生命周期阶段中插件目标的逻辑。

约定优于配置

约定优于配置是一个简单的概念,系统、类库、框架给定一个合理的默认值。Maven通过给项目提供默认行为来融合这一概念,在没有自定义的情况下

  • 源代码放在:workspace/src/main/java
  • 资源文件放在:workspace/src/main/resources
  • 测试代码放在:workspace/src/test
  • 字节码文件放在:workspace/target/classes
  • 可发行的jar包放在:workspace/target

Maven和Ant的区别

Apache Ant

  • Ant 没有正式的约定一个项目的目录结构,你必须明确的告诉Ant哪里放源码,哪里放字节码等。
  • Ant 是程序化的,你必须告诉 Ant 做什么,什么时候做。
  • Ant 没有生命周期,你必须定义目标和目标之间的依赖。

Apache Maven

  • Maven 拥有约定,遵守了约定, Maven 就知道你的源代码放在了哪里。
  • Maven 是声明式的。你只需要创建一个 pom.xml 文件并将其放在默认的目录下, Maven 就会帮你干其他的事了。
  • Maven 拥有生命周期,当你运行相应的命令后就会被调用,这条命令会告诉 Maven 执行一系列的有序步骤, 直到达到指定的生命周期。

2 Maven 安装


Maven安装

安装自行解决😁,有问题下方留言

安装及环境变量设置成功显示

  • java -version
  • mvn -v
环境变量设置成功

Maven目录及配置说明

我们先打开安装好的 Maven目录看看。

maven 目录

其中:

  • bin目录:包含了运行 Maven 的一些脚本。
  • boot目录:包含了一个负责创建 Maven 运行所需要的类加载器的 jar 文件 。
  • conf目录:包含了一个全局的 settings.xml 文件,该配置文件用来自定义你电脑上的 Maven 的行为。如果我们要自定义 Maven,我们通常会将该配置文件覆盖掉 ~/.m2目录下的 settings.xml 文件。
  • lib目录:包含了 Maven的核心jar包。
  • LICENSE:包含了 Apache Maven 的软件许可证。
  • NOTICE:包含了 Maven 依赖的类库所需要的通告及权限。
  • README.txt:包含了一些安装指令

接着我们再来看看本地的 Maven 仓库,进入~/.m2目录

本地 maven 仓库

其中:

  • settings.xml:包含了用户的相关凭证,仓库和其它信息的配置。
  • repository目录:本地仓库,当从maven远程仓库下载jar依赖的时候,会自动下载到该目录下。

3 第一个demo


当我们把maven环境搭建好之后,我们来创建一个maven项目。

1) 创建 maven 项目

mvn archetype:create 
                -DgroupId=org.sonatype.mavenbook.ch03 //项目id
                -DartifactId=demo //项目名
                -DpackageName=com.acey.demo  //包的目录结构

注意

  • 第一次创建maven项目会自动下载很多jar包。
  • 如果你的 maven 版本是
  • 2.x,使用命令mvn archetype:create创建maven项目
  • 3.x,使用命令mvn archetype:generate创建maven项目
  • 如果运行上面的命令出现卡死
    卡死
    那么需要加上参数-DarchetypeCatalog=internal,让maven 不要从远程服务器上获取catalog。
mvn archetype:generate
                -DgroupId=org.sonatype.mavenbook.ch03 //项目id
                -DartifactId=demo //项目名
                -DpackageName=com.acey.demo  //包的目录结构
                -DarchetypeCatalog=internal

一切顺利的话,我们便可以在当前目录下找到我们创建的 maven 项目了,打开后可以看到项目的目录结构。


demo 目录结构

2)mvn install

在项目跟路经下执行 mvn install命令

mvn install
install 步骤

可以先看下整个执行步骤,详情会在后面的 maven 生命周期中详细介绍。

3)运行

java -cp target/demo-1.0-SNAPSHOT.jar com.acey.demo.App
结果

4 核心概念


1)Maven 插件和目标(Plugins and Goals)

一个 Maven 插件(plugin)是一个或多个目标(goal)的集合。而一个目标是 Maven 中的一个工作单元(unit of work),他可以作为以个单独的目标运行,也可以作为一个大的构建的一部分和其它目标一起运行。用以下格式表示:

pluginId:goalId

在我们构建 Maven 项目时,我们便用到了archetype插件和generate目标。当然目标也是可以定义一些参数。

mvn archetype(插件):generate(目标)
                -DgroupId=org.sonatype.mavenbook.ch03 //目标参数
                -DartifactId=demo //目标参数
                -DpackageName=com.acey.demo  //目标参数
                -DarchetypeCatalog=internal //目标参数

2)生命周期(Lifecycle)

Maven有三套相互独立的生命周期

  • Clean Lifecycle:在真正的构建之前进行项目的清理工作
  • Default Lifecycle:构建的核心部分,包含编译、测试、打包、部署等。
  • Site Lifecycle:生成项目报告,站点,发布站点。

其中:
Default Lifecycle包含了一系列阶段的序列。

一系列阶段的序列

插件目标也是可以附着在生命周期上的,它会随着生命周期的移动,执行附着在不同生命周期上的目标。每个阶段上附着的零个或多个目标。例如:放我们执行 mvn package时,我们会发现它会默认的执行该生命周期前的生命周期所对应的目标,当达到目标生命周期(package)时,会执行附着在package上的jar:jar进行打包。

mvn package

我们再来看看每个周期所对应的目标

周期对应目标

mvn package 会自动执行它前面周期所对应的目标,然后打包
mvn jar:jar 只会打包


Clean Lifecycle一共包含三个阶段

  • pre-clean:执行一些需要在 clean 之前完成的任务
  • clean:移除所有上次构建所生成的文件
  • post-clean:执行一些需要在 clean 之后完成的任务

Site Lifecycle一共包含了四个阶段

  • pre-site:执行了一些需要在生成报告站点之前完成的工作
  • site:生成项目的站点文档
  • post-site:执行一些需要在生成报告站点之后完成的任务
  • site-deploy:将生成的站点文档部署到远程服务器

当我们执行mvn site后,我们会发现我们的 target 目录下会生成一个 site 目录,里面包含了项目的各种报告。

mvn site

3)Maven 坐标(Coordinates)

Maven坐标定义了一组标识,它可以用来唯一标识一个项目,一个依赖,或者是一个POM里面的插件。我们先来看一个简单的POM。

pom

其中 groupIdartfiactIdversionpackaging共同组成了项目的坐标,Maven通过一个坐标来定位一个项目,Maven 坐标一般会用冒号作为分隔符来书写。

groupId:artifactId:packaging:version

在上图的项目坐标就可以表示为:

testdemo:demo:jar:1.0-SNAPSHOT

当然这个符号也应用于项目依赖,上图项目中依赖了 JUnit的3.8.1版本,那么它就包含了一个junit:junit:jar:3.8.1的依赖。

  • groupId:表示一个团体标识,它一般以创建这个项目的组织名称的逆向域名(version domain name)开头。比如 Apache Software 就以·org.apache·作为 groupId。
  • artifactId:在 groupId 下的表示一个单独项目的唯一标识,一般为项目名。
  • version:一个项目的特定版本。如果是正在开发中的项目那么一般会加上一个特殊的标识,在版本号前加上 “SNAPSHOT"的标记。
  • package:项目的类型,默认为jar,描述了项目打包后的输出格式。也可以打包成一个 war。

4)Maven 仓库(Repositories)

当我们在运行 Maven 项目的时候,Maven 会从 pom.xml 中查找已配置的插件坐标,然后在本地仓库中查找是否有对应的插件,如果没有那么就会从 Maven 自带的远程仓库http://repo1.maven.org/maven2 中下载所需要的插件缓存到本地仓库。本地仓库的默认地址:

  • window中:* C:\Users\USERNAME.m2\repository*
  • linux中:~/.m2/repository

如果我们有需要的话也是可以修改本地仓库的地址

  • 更改配置用户范围的本地仓库:
  • 在 /.m2/ 目录下创建一个setting.xml或者将M2_HOME/conf/settings.xml拷过来
  • 在 setting.xml 中添加以下节点。
<settings>  
    <localRepository>新的仓库地址</localRepository>  
</settings> 
  • 更改配置全局范围的本地仓库
  • 直接在M2_HOME/conf/settings.xml添加以下节点
<settings>  
    <localRepository>新的仓库地址</localRepository>  
</settings> 

当 Maven升级后,所有的配置都将会被清除,所以一般不推荐修改全局的配置


Maven插件存储结构

在我们打开本地仓库(repository) 后,我们会看到很多的插件,Maven 仓库会按以下目录格式来存储插件。

/< groupId >/< artifactId >/< version >/< artifactId >-<version>.< packaging >

比如 c3p0-0.9.1.2.jar的存储方式

c3p0

当我们用mvn install对项目进行install时,Maven 也会按上述的格式将所生成的jar/war包保存在仓库中作为依赖插件。

5)Maven 依赖管理(Dependency Management)

所谓依赖就是项目中使用了一些插件,当我们需要运行项目时,我们必须将相应的插件加进来。而 Maven 依赖管理则是将所需要的插件下载到本地仓库,当我们需要使用插件时,只需要在 pom.xml 中去配置相关的依赖即可。

pom.xml

可以看到我们需要加一个依赖也是很简单,只需要在 pom.xml 中在 dependencies 下加一个 dependency 即可,其中 groupIdartifactIdversion决定了 junit的坐标,而 scope 则表示junit的作用范围,test 表示只有项目在执行 compiler:testCompilesurefire:test目标的时候才会被加入到 classpath中。

几个 scope 范围

  • compile,缺省值,适用于所有阶段,会随着项目一起发布。
  • provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
  • runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
  • test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
  • system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。

Maven 的基础概念就差不多啦,大家有疑问的话可以在下方留言哦。😀
下一篇会讲讲实战和更深层次的内容。
(❤ ω ❤)喜欢的话点个❤呗。

相关文章

  • Maven指南(一) - 两小时从零到了解

    1 Maven 介绍 是什么 Maven是一个项目管理工具,它包含一个目标对象模型POM(project Obje...

  • 使用自己安装的Maven插件

    刚接触Maven工具, Maven是一个项目管理工具,相关了解Maven可以在下面的网站了解: Maven入门指南...

  • 音视频学习从零到整-实现视频编码

    音视频学习从零到整(1)音视频学习从零到整(2)音视频学习从零到整(3)音视频学习从零到整(4) 一.了解Vide...

  • 音视频学习从零到整-了解视频编码与VideoToolBox框架

    音视频学习从零到整(1)音视频学习从零到整(2)音视频学习从零到整(3) 一..了解VideoToolBox 硬编...

  • 初创企业从零到一的融资指南

    来源 | 以太资本A+社晚八点分享 在分享之初,我们先来思考几个问题,打开一下我们的脑洞: 1、初创企业在不同融资...

  • 从零到一

    从零到一 或者说从计划到成果 这是我对自己刚刚过去一年的一个大的方面的总结 从十点读书会年会结束到现在,我...

  • 《从零到一》

    《from zero to one》彼得-蒂格 第一章《The Challenge of the Future》:...

  • 从零到一

    看很多朋友在简书上写作,于是决定开始写作,谁都知道写作是一件多么重要但不紧急的事,不写,永远有明天。一天不忙下来,...

  • 从"零"到"一"

    借用一本书的标题,对我而言"零"指的是对西点的制作一无所知,"一"指的是我终于学会了一款。自从买了烤箱,探索美食的...

  • 从零到一

    随着A1犁煤器照明灯的方位调好,电话那头运行说可以了,我无法掩饰自己内心的激动,装作拍手上的灰给自己鼓了两次手。这...

网友评论

  • 饺子天津饭:感觉能学会 ,还没开始弄呢 点个赞先
  • SimpleChenyh:首先,非常感谢作者。
    我有几个问题:
    一,就是我觉得maven的仓库很慢,就用了阿里巴巴的maven仓库(在repositorys—>repository标签中添加的不知道其它的位置用不用改了),但是我发现生成项目的时候,并没有用我指定的仓库下载,还是从默认的maven仓库下载怎么办
    二,我看到有很多maven仓库,有阿里巴巴的,repo1,repo2,OSCHINA(记不清了)等,貌似四五个吧,但下载的时候都没有从顶上下载,还有就是想确认一下https://search.maven.orghttps://mvnrepository.com这两个网站属于什么性质,我看了几个远程仓库和这个,发现这两个网站上的jar包要全很多,版本很全,更新的还非常的快,可不可以用这两个网站做远程仓库呢?
    我是新手还请多多包涵。
    SimpleChenyh:@Acey 感觉明白了许多,谢谢作者.
    司鑫:配置远程仓库的话有两种方式,一种是在 setting.xml 中配置,一种是在项目中的 pom.xml 中配置,前者是全局的配置,后者只是在当前项目中使用,不同的仓库的 id 、url等都不同,这个可以去搜索找一下。
    Maven 搜索依赖的顺序
    1)先搜索本地仓库,没有找到,就去第2步
    2)搜索中央仓库,没有找到,就去第3步
    3)去Java.NET远程仓库获取,没有找到,就报错,否则退出

    当我们需要写某个jar的依赖时,又不知道该jar的相关信息,那么就可以去这两个https://search.maven.org,https://mvnrepository.com 网站查询了,主要是给开发者用的,而仓库是maven用来搜索依赖的一个地方,maven.aliyun.com/nexus/content/groups/public/(阿里云的maven仓库)可以进去看看。

    由于自己也是新手,所以解释的可能会有些不专业或是有些错误。发现的请提出。。。。:sweat:
  • 6d96978eeefb:写的很好,运用了多种方式(比如图表)来表达内容,看起来很容易懂👍

    有一个疑问:如果有多个goal附着在同一个生命周期阶段,那这几个goal的执行顺序是什么样的,谁先谁后?

    一些可改进的地方:
    1. 有不少错别字,拼音输入法的错,可以再细心检查一下
    2. 有的名词(比如“目标”)给出了中文的同时,可以在后面加上它对应的英文的名词,不然看的时候就不确定它是不是指代的是一个专用的概念。可以在容易引起误会的地方(比如第一次出现等)添加
    3. 画图的时候还可以更加注重图形的表达。比如前面plugin与goal的那个图,如果画成树形会更好(个人意见);另外关于编译期的生命周期阶段,如果把测试的那三个阶段放在一行,看起来会更明显
    6d96978eeefb: @Acey 如果多个goal是在不同的pom中绑定的(比如有 parent pom),顺序又怎么确定?
    司鑫:嗯呢,谢谢总理:smile: 。当有多个 goal 附着在同一个 phase 上时, goal 的执行顺序就是 goal 绑定的顺序。图我再改改,当时写的时候没想太多:sweat:

本文标题:Maven指南(一) - 两小时从零到了解

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