本文主要讲Maven的基础知识。

一 什么是Maven?

Maven是一个项目管理工具。Maven提供了一个项目对象模型(POM)文件的新概念来管理项目的构建,相关性和文档。最强大的功能就是能够自动下载项目依赖库。

Maven这个词可以翻译为‘专家’、‘内行’。Maven是Apache组织中一个比较成功的开源项目,maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理。

无论是小型的开源类库项目,还是大型的企业级应用;无论是传统的瀑布式开发,还是流行的敏捷开发,maven都能大展身手。

二 Maven都包含哪些内容?

它包含了

  • 一个项目对象模型 (Project Object Model),
  • 一组标准集合,
  • 一个项目生命周期(ProjectLifecycle),
  • 一个依赖管理系统(Dependency Management System),
  • 用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。

当你使用Maven的时候,你用一个明确定义的项目对象模型(pom.xml)来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。Maven项目的结构和内容在一个XML文件中声明,pom.xml 项目对象模型(POM),这是整个Maven系统的基本单元。

三 约定优于配置

约定优于配置是一个简单的概念。 系统,类库,框架应该假定合理的默认值,以简化使用时的配置,同时保留了用户修改默认配置权利。但是,在大部分情况下,你会发现使用 框架提供的默认值会让你的项目运行的更快或者更加方便。

在maven中,没有自定义的情况下,目录一般如下,

  • 源代码是在 /myApp/src/main/java
  • 资源文件是在 /myApp/src/main/resources
  • 测试代码是在 /myApp/src/test

项目会产生一个 JAR 文件。Maven会把

  • 编译好的字节码放到 /myApp/target/classes
  • 创建的可分发JAR 文件放在 /myApp/target

举例说明,下面的表格展示了工程源码文件、资源文件的默认配置,和其他一些配置。假定 ${basedir} 表示工程目录:

配置项 默认值
source code ${basedir}/src/main/java
resources ${basedir}/src/main/resources
Tests ${basedir}/src/test
Complied byte code ${basedir}/target
distributable JAR ${basedir}/target/classes

开发者不需要再关心每一个配置细节。Maven 为工程提供了合理的默认行为。当创建 Maven 工程时,Maven 会创建默认的工程结构。开发者只需要合理的放置文件,而在 pom.xml 中不再需要定义任何配置。

四 maven与Ant的区别

 Ant 也是Java 编程项目的一种构建工具。

Apache Ant

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

Apache Maven

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

从我自己的理解来看,他们最大的区别是,maven约定优于配置:maven约定了哪个目录是干嘛的,而ant都需要配置。借鉴了下大神们的答案(作者sunboy,出处http://www.linuxidc.com/Linux/2013-05/84489.htm):

Maven

Ant

标准构建文件

project.xml 和 maven.xml

build.xml

特性处理顺序

${maven.home}/bin/driver.properties

${project.home}/project.properties

${project.home}/build.properties

${user.home}/build.properties

通过 -D 命令行选项定义的系统特性,最后一个定义起决定作用。

通过 -D 命令行选项定义的系统特性

由 <property> 任务装入的特性

第一个定义最先被处理。

构建规则

构建规则更为动态(类似于编程语言);它们是基于 Jelly 的可执行 XML。

构建规则或多或少是静态的,除非使用 <script> 任务。

扩展语言

插件是用 Jelly(XML)编写的。

插件是用 Java 语言编写的。

构建规则可扩展性

通过定义 <preGoal> 和 <postGoal> 使构建 goal 可扩展。

构建规则不易扩展;可通过使用 <script> 任务模拟 <preGoal> 和 <postGoal> 所起的作用。

由上比较可知,Maven 和 Ant 代表两个差异很大的工具。

五 Maven的优势

1)跨平台

2)服务于构建

它是一个异常强大的构建工具,能够帮助我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署;

3)标准化

Maven能够帮助我们标准化构建过程。在Maven之前,十个项目可能有十种构建方式。有了Maven后,所有项目的构建命令都简单一致,极大的避免了不必要的学习成本,而且有利于促进项目团队的标准化。

4)封装构建过程

我们一直不停的寻找避免重复的方法:设计的重复,编码的重复,文档的重复,当然还有构建的重复。Maven最大化的清除了构建的重复,抽象了构建的生命周期,并且为绝大部分的构建任务提供了已实现的插件,我们不在需要定义过程。

5)依赖管理工具

在这个开源的年代里,几乎任何java应用都会借用一些第三方开源类库,这些类库都可以通过依赖的方式引入到项目中来。随着依赖的增多,版本不一致,版本冲突,依赖臃肿等问题都会接踵而来。手动解决这些问题十分枯燥,幸运的是Maven提供了一个优秀的解决方案,它通过一个坐标系统准确的定位每一个构件,也就是通过一组坐标maven能够找到任何一个java类库。maven给这个类库世界引入经纬,让他们变得有秩序,于是我们可以借助它来有序的管理依赖,轻松的解决那些繁杂的依赖问题。

Maven为全世界的java开发者提供了一个免费的中央仓库,在其中几乎可以找到任何流行的开源类库。

6)项目规范化

使用Maven还有一个额外的好处,maven对项目的目录结构,测试用例的命名方式等内容都有既定的规则,只要遵循了这些成熟的规则,用户在项目间切换时就免去了额外的学习成本,可以说约定优于配置。

六 为什么使用Maven

因为公司都在使用maven,我们要为公司卖命,就得用,所以就得学(笑了)。

公司为什么使用maven?提高效率,降低成本。

七 参考资料&内容来源

http://maven.apache.org/guides/getting-started/index.html

https://www.yiibai.com/maven/

http://www.sxt.cn/java-maven/1-1.html

https://www.jianshu.com/p/78c16fc600a9

https://www.cnblogs.com/chrischennx/tag/maven/

http://www.runoob.com/maven/maven-tutorial.html

https://www.w3cschool.cn/maven/u7oe1ht0.html

Maven学习笔记【1】 -- Maven简介的更多相关文章

  1. MAVEN学习笔记之Maven生命周期和插件简介(3)

    MAVEN学习笔记之Maven生命周期和插件简介(3) clean compile site三套生命周期相互独立. clean pre-clean 执行清理前的工作 clean 清理上一次构建生成的所 ...

  2. MAVEN学习笔记之Maven插件的应用(4)

    MAVEN学习笔记之Maven插件的应用(4) <build> <pluginManagement> <plugins> <plugin> <gr ...

  3. Maven学习笔记:Maven简介

    Maven的概念 Maven是基于项目对象模型(POM,Project Object Model),可以通过描述信息来管理项目的构建,报告和文档的软件管理工具 Maven除了以程序构建能力为特色之外, ...

  4. MAVEN学习笔记之私服Nexus(2)

    MAVEN学习笔记之私服Nexus(2) 私有服务器搭建 Nexus www.snatype.org下载 snatype-work 是默认nexus存储nexus a:将bin添加到环境中 Admin ...

  5. Maven学习笔记-03-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  6. Maven学习笔记-04-Eclipse下maven项目在Tomcat7和Jetty6中部署调试

    现在最新的Eclipse Luna Release 已经内置了Maven插件,这让我们的工作简洁了不少,只要把项目直接导入就可以,不用考虑插件什么的问题,但是导入之后的项目既可以部署在Tomcat也可 ...

  7. Maven学习笔记—仓库

    Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...

  8. MAVEN学习笔记之基础(1)

    MAVEN学习笔记之基础(1) 0.0 maven文件结构 pom.xml src main java package resource test java package resource targ ...

  9. Maven 学习笔记(二)

    前面一文——Maven 学习笔记(一)中已经提到了 pom 的大部分配置,Maven 本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给创建来完成,每一个任务都会对应一个插件 ...

  10. C#.NET学习笔记1---C#.NET简介

    C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...

随机推荐

  1. JDK自带监控工具 jps、jinfo、jstat、jmap、jconsole

    分类: JVM 2010-10-04 11:05 587人阅读 评论(0) 收藏 举报 工具jdkjava远程连接unixstring 常用有五个命令行工具: jinfo: 可以输出并修改运行时的ja ...

  2. Nginx主动连接与被动连接的差别

    1.主动连接是指Nginx主动发起的同上游server的连接:被动连接是指Nginx接收到的来自client主动发起的连接; 2.主动连接用ngx_peer_connection_t结构体表示:被动连 ...

  3. android:ellipsize实现跑马灯效果总结

    最近无意间看到了涉及到跑马灯效果的代码,于是在网上查阅了很多资料,在这里对自己看的一些文章进行一下总结,顺便加上自己的一些体会. 让我们一步步逐渐向下. 首先我们要实现走马灯这样一个效果,通常来说都是 ...

  4. 使用CAsyncSocket总结

    最近想起CAsyncSocket这个类,记得很早以前用过,现在却想不起来怎么用了,翻了翻以前的代码又看了看msdn感觉这个类做简单的异步socket太简单了,几行代码就可以搞定,在此先做个总结. 不管 ...

  5. struts2学习笔记(一)

    1.搭建第一个struts2 app. web.xml  <?xml version="1.0" encoding="UTF-8"?> <we ...

  6. \r与\n有何差别,编码的时候应该怎样使用

    差别: \r: 全称:carriage return (carriage是"字车"的意思.打印机上的一个部件) 简称:return 缩写:r ASCII码:13 作用:把光标移动到 ...

  7. 【C#】重载重写重构

    前言 前几篇博客说了重写和重载.今天主要说重构,顺便比較一下三者. 重构.重写.重载 重构就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理.提高软件的扩展性和维护性. 通俗点 ...

  8. python下载腾讯云慢日志并发送邮件附件

    这里没优化,只是对腾讯云下载慢日志,然后通过邮件发送出去 #!/usr/bin/env python # encoding: utf-8 import json import smtplib impo ...

  9. ansible远程切换用户执行命令

    ansible test -l 10.0.10.1 -e "ansible_become_user=www" -m shell -a "/data/publish/pub ...

  10. 深入理解get和post的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二.最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 正常GET和 ...