写点什么

Maven 简介

作者:andy
  • 2022-10-28
    北京
  • 本文字数:2596 字

    阅读完需:约 9 分钟

一、缘由


在 the Jakarta Turbine project 大型项目开发过程中,旗下的多个子项目,互相之间拥有各自的 Ant 构建文件,而这些文件则又完全不同(因爲 Ant 允许自由的定义项目的结构)。同时,所有的 jar 包都存储进了 CVS。因此,对于文件和 jar 包的管理上非常混乱。


二、什么是 Maven?


Maven 最初的想法就是要简化项目的构建过程。之后的发展目标便是提供一个标准方式去构建项目,同时,定义项目是由什么构成的,也提供一个简易的方式去发佈项目,并且多个项目可以共享 jar 文件。


Maven 是一个项目的管理和构建自动化的工具,基于项目对象模型(project object model,POM)。通俗的说,Maven 就是一个提供简易管理 jar 文件的工具。Maven 爲了能够让开发者在最短时间内理解开发的完全状态,致力于解决以下目标:


1、使得构建过程简易化

虽然固定的项目结构过于机械化,但是,也达到快速简易构建项目的目的,也在一定程度上起到了保护作用。

2、提供一致的构建系统

通过使用项目对象模型和共享插件,可以让你在构建多个项目时,节省大量的精力和时间。

3、提供可靠的项目信息

通过项目对象模型,也即项目的 POM 文件,可能瞭解到项目的可靠信息,比如依赖关係列表。

4、为最好的实践开发提供指导

提供一些项目目录分层的指导,可以更容易引导其他使用 maven 的项目。同时,提供很好的工作流,用于发佈管理和问题追踪。

5、允许透明的迁移到新特性上

可以更加方便的变更插件,包括新的和修改的插件的安装,为客服提供高效便捷的服务。


三、Maven 的安装


系统要求


1、Java Development Kit(jdk),Maven 版本会要求对应的 jdk 版本,可通过 Maven 下载官网查看。

2、硬盘,安装目录大小大约需要 10MB 空间,但是,对于 Maven 的本地仓库的大小,由使用程度决定,建议至少 500MB。

3、操作系统,操作系统没有要求,安装程序会提供对应系统脚本文件,如 Linux 提供 shell 脚本。


安装文件


从 Maven 官网上下载可用安装程序,解压至相应的目录下。


配置属性


将解压后的可执行文件目录添加到环境变量 path 上,便于执行 Maven 命令。可在命令行执行 mvn -v 指令检验 Maven 是否成功。若是成功,则返回以下信息:


C:\Users\ys>mvn -vApache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00)Maven home: D:\apache-maven-3.5.2-bin\apache-maven-3.5.2\bin\..Java version: 1.8.0_66, vendor: Oracle CorporationJava home: D:\Java\jdk1.8.0_66\jreDefault locale: zh_CN, platform encoding: GBKOS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
复制代码


第一次执行 Maven 的构建命令后,会在用户目录下生成本地仓库目录(/用户/.m2/repository),同时,需要保证本地电脑网络连接,因爲 Maven 要从远程仓库下载插件(jar 包)备份至本地库下。若远程库没有所需插件,则可以自己搭建私服或者手动下载放置本地库中。


四、Maven 构建项目


在此不复杂介绍 Maven 如何构建大型项目,同时,对于 Maven 的指令,可以查看文档进行学习,这里不做过多赘述,衹是做一个简单示例,説明 Maven 构建项目的大致流程。


1、命令行输入构建指令,这里爲了快速观察效果,使用快速简单模式。

mvn archetype:generate -DgroupId=org.apache -DartifactId=mymvn -Dpackage=org.apache.mymvn -Dversion=1.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

如果结果显示 BUILD SUCCESS,则表示构建成功,所有源程序和测试程序保存在 src 目录下。


2、进入构建项目的第一层目录,即 mymvn 目录下,执行 mvn package 指令,进行程序打包。打包成 功后,生成的字节码会保存至 target/classes/目录下,打好的 jar 包或者 war 包则保存至 target/目录下。


3、测试程序,执行 java -cp mymvn-1.0-SNAPSHOT.jar org.apache.mymvn.App 指令,结果显示 Hello World!则表示成功。


五、POM(Project Object Model)


项目的配置信息都放置在 pom.xml 文件里,包含项目的类型、项目的名字、依赖关係、插件的行爲等等。在 POM 中,groupId、artifactId、packaging、version 叫做 Maven 坐标,能够唯一确定一个项目,这样就可以用来指定项目所依赖的其他项目、插件或者父项目了。groupId 指的是开发组织名称,artifactId 指的是模块组件的名称。最终的包名称,则由 groupId.artifactId 组成。Maven 坐标格式如下:

groupId:artifactId:packaging:version


大项目由几个子项目组成,每个子项目都有自己的 POM 文件,同时都有一个共同的父项目,子项目的 POM 则会继承父项目的 POM,构建了父项目就能够构建所有子项目。所有的 POM 都继承了一个 Super-POM,它设置了一些默认值,如默认的目录结构和插件等等,遵循了惯例优于配置的原则。可以通过 mvn help:effective-pom 查看 pom 的全部内容。


如果要通俗的说,用面向对象的思想来理解即可,项目即一个对象,会有继承关係。


子项目和子模块,本质都是继承了父项目的所有设置信息,两者区别在于子项目是重新建立新的空间存储项目文件,而子模块则是在父项目的目录基础上,建立子目录存储模块文件。


六、Maven 插件


实际上 Maven 本身不做太多的事情,而是交给插件去执行项目的构建工作。一个插件包含一个或者多个目标,一个目标即是一个工作单元。比如之前构建简单的项目的指令 archetype:generate,就是 archetype 插件完成 generate 目标。再比如 Jar 插件包含建立 Jar 文件的目标,Compiler 插件包含编译源代码和单元测试代码的目标。


七、Maven 生命周期


Maven 生命周期,即使构建项目的各个阶段,每个阶段都会绑定一个或多个插件去完成一个或者多个目标。生命周期分爲以下几个部分:


process-resources 阶段:resources:resourcescompile 阶段:compiler:compileprocess-classes 阶段:(默认无目标)process-test-resources 阶段:resources:testResourcestest-compile 阶段:compiler:testCompiletest 阶段:surefire:testprepare-package 阶段:(默认无目标)package 阶段:jar:jar
复制代码


八、依赖管理


在 POM 中,依赖关係是在 dependencies 中定义的。因爲 Maven 提供传递依赖的特性,所以,不需要把所有间接依赖的关係定义在 POM 中。在 POM 中,scope 定义依赖关係的适用范围。scope 为 test,则相应 jar 文件衹会在 compiler:testCompile and surefire:test 目标的时候被加到 classpath 中;scope 为 provided,则表示 jdk 或者容器会提供 jar 包,如 servlet API jar 包;scope 的默认值是 compile,即在任何时候都会被包含到 classpath 中。


九、子模块与子项目


用户头像

andy

关注

还未添加个人签名 2019-11-21 加入

还未添加个人简介

评论

发布
暂无评论
Maven简介_andy_InfoQ写作社区