zoukankan      html  css  js  c++  java
  • Maven学习笔记【1】 -- Maven简介

    本文主要讲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

  • 相关阅读:
    windows 按时自动化任务
    Linux libusb 安装及简单使用
    Linux 交换eth0和eth1
    I.MX6 GPS JNI HAL register init hacking
    I.MX6 Android mmm convenient to use
    I.MX6 GPS Android HAL Framework 调试
    Android GPS GPSBasics project hacking
    Python windows serial
    【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
    freemarker跳出循环
  • 原文地址:https://www.cnblogs.com/zhaoweikai/p/10224834.html
Copyright © 2011-2022 走看看