Maven系列(一):hello,Maven!

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jzyhywxz/article/details/77984723

Maven是什么?

Maven这个单词来自于意第绪语(Yiddish),本意为“知识的积累”(accumulator of knowledge),亦有“内行”、“专家”之意。实际上,这里将要介绍的Maven是一款跨平台的项目管理工具。

maven

在Apache Maven官网上,有这样一段介绍:

Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.

大意是说:Maven作为一个软件项目管理和理解工具,可基于项目对象模型(POM)来管理项目的构建、报告和文档。

作为Apache组织中的一个颇为成功的开源项目,Maven主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。

什么是构建?

小Zh是一个程序猿,他几乎每天都做着同样的工作:8点到公司后,首先从代码库中拿到最新的代码,然后进行编译和单元测试,如果编译失败或者有测试未通过,就去找相关的同事咨询。等9点开完半个小时的早会后,继续编写自己的项目代码和单元测试,顺利的话还能进行几轮清理、编译和测试工作。到12点,和同事一起享受午餐,休息到13点半后,继续上午的工作。快到18点时,如果今天的工作做的差不多了,就准备写完日报下班回家,否则只能做好加班的准备了。

仔细总结一下,我们会发现小Zh每天除了编写源代码之外,还有相当一部分时间花费在了编译、单元测试、编写文档、打包和部署等繁琐的工作上,这就是构建。

如果我们自己动手做这些,一是难免出错,二是效率太低。如果有一种方法或者工具能让这一系列工作完全自动化,使软件构建只需要一条或几条命令就能完成并得到结果,那我们的开发效率将大幅提升。而Maven正是这样一款自动化构建工具。

Maven能做什么?

第一,Maven服务于构建。从清理、编译、测试到生成报告,再到打包和部署,Maven能够帮我们自动化整个构建过程。它吸收了大量其他构建脚本和构建工具的优点,抽象了一个完整的构建生命周期模型。

第二,Maven标准化了构建过程。没有Maven之前,十个项目可能有十种构建方式,有了Maven之后,所有项目的构建命令都是一致的,这极大地避免了学习成本,也促进了团队的标准化。

第三,Maven是一个依赖管理工具。在这个开源的时代里,几乎任何Java应用都会使用一些第三方开源类库。随着依赖的增多,版本不一致、版本冲突、依赖臃肿等问题都会接踵而至,手工解决这些问题是十分繁琐的。为此,Maven给这个类库世界引入了“经纬”,使这些类库变得有秩序,于是我们可以借助它来有序的管理依赖,轻松地解决那些繁杂的依赖问题。

第四,Maven是一个项目信息管理工具。Maven能帮我们管理分散在项目中的项目信息,包括项目描述、开发者列表、版本控制系统地址、许可证、缺陷管理系统地址等。除此之外,通过Maven自动生成的项目站点和一些插件,还能获得项目文档、测试报告、静态分析报告、源码版本日志报告等有价值的项目信息。

第五,Maven提供了一个免费的中央仓库,在其中可以找到大部分流行的开源类库。通过一些Maven的衍生工具(如Nexus),还可以对其进行快速搜索,只要提供了“坐标”,Maven就能帮我们自动下载类库。

第六,Maven遵循约定优于配置(convention over configuration)。Maven对于项目目录结构、测试用例命名方式等内容都有既定的规则,只要遵循这些规则,开发者在项目间切换时就免去了额外的学习成本。

为什么需要Maven?

Maven并不是唯一的构建方案,除了Maven之外,也有许多优秀并且用户众多的构建方案。下面会简单介绍一些其它的构建方案,并通过对比来体现Maven的优势。

IDE

只要写过代码的人估计没有谁不知道什么是IDE的。集成开发环境(IDE,Integrated Development Environment)是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务,如Visual Studio、Eclipse、IntelliJ IDEA等。

IDE

优秀的IDE能够大大提高开发效率,但是IDE并不是万能的。一方面,使用IDE时,清理、编译、测试等工作都是相互独立的,并不能一键完成所有工作;另一方面,每个开发者对IDE有自己喜好的配置,因此一个在IDE1中正常的项目,导入到IDE2中可能就会产生异常。

Makefile

只要是在Linux环境下写过C语言的程序员一定不会对make陌生。在Linux环境下使用make工具能够很好的构建和管理项目工程,整个工程的清理、编译、运行等工作只需要一条命令就可以完成,但这需要我们编写一个或几个Makefile文件。

edit : main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
    cc -o edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o
main.o : main.c defs.h
    cc -c main.c
kbd.o : kbd.c defs.h command.h
    cc -c kbd.c
command.o : command.c defs.h command.h
    cc -c command.c
display.o : display.c defs.h buffer.h
    cc -c display.c
insert.o : insert.c defs.h buffer.h
    cc -c insert.c
search.o : search.c defs.h buffer.h
    cc -c search.c
files.o : files.c defs.h buffer.h command.h
    cc -c files.c
utils.o : utils.c defs.h
    cc -c utils.c
clean :
    rm edit main.o kbd.o command.o display.o \
        insert.o search.o files.o utils.o

Makefile文件定义了一系列规则,每一条规则又包括目标、依赖和需要执行的命令。编写好Makefile之后,我们只需要在shell中输入make命令,整个工程将自动完成编译,这极大地提高了开发效率。

但是,make将自己和操作系统绑定在一起,这意味着使用make不能或很难完成跨平台的构建。

Ant

这里的Ant可不是“蚂蚁”,而是“另一个整洁的工具”(Another Neat Tool),它最早是用来构建著名的Tomcat Web容器的。其作者创建它的动机之一就是因为受不了Makefile的语法格式,简单的说Ant可以看作是一个Java平台的make,也正因为使用了Java,因此Ant是跨平台的。

与make类似,Ant有一个构建脚本build.xml,它的基本结构也是目标、依赖和实现目标需要执行的任务。

<project name="MyProject" default="dist" basedir=".">
  <description>
    simple example build file
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist" location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source">
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution">
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up">
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

和make一样,Ant也是过程式的,开发者需要显式地指定每个目标、该目标的依赖以及实现该目标需要执行的任务,针对每一个项目,开发者都需要重新编写这一过程。

Maven

比起IDE单独分离的清理、编译、测试等工作,Maven只需要一条或几条命令就能完成整个构建过程,而不用一次次的点鼠标或者按快捷键;Maven不像make那样和操作系统捆绑在一起,而是跨平台的;和ant的过程式不同,Maven是声明式的,构建过程的各个阶段所需的工作都由插件实现,并在POM文件中声明,而且大部分插件都是现成的,这很大程度地消除了重复。

<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.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>Maven Quick Start Archetype</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

微信公众号

笔者的微信公众号上线啦,这里会推送优质的计算机相关的文章,欢迎大家关注哦!

qrcode

快把我推荐给身边的小伙伴吧ヾ(๑╹◡╹)ノ”

猜你喜欢

转载自blog.csdn.net/jzyhywxz/article/details/77984723