最近用到了Maven,就开始看看文档,网上找找资料,看了些视频。现在整理一下,仅供参考。
0x00 关于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的介绍。经过几天的折腾,我觉得Maven是一个开源的项目构建、管理工具,能够让团队更加高效的合作开发项目。其核心是pom文件,拥有一系列强大的插件和一个中央仓库。
古人说的好:纸上得来终觉浅,绝知此事要躬行。至于Maven是干什么用的,怎么用,我们下载一个,安装好,用用就知道了。或许你能够对Maven理解的更进一步。
0x01 安装Maven
接下来说一下,在windows环境下,如何安装Maven。选用的Maven版本是apache-maven-3.3.9。
-安装JDK
-设置Java环境变量
-设置Maven环境变量
*安装JDK
这个就没什么好说了。=_=
*设置Java环境变量
Control Panel -> System and Security -> System -> Advanced system settings -> Enviroment Variables
系统变量下 { 注:【】只是为了强调说明 }
新建CLASSPATH
值为【.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;】
新建JAVA_HOME
值为【C:\Program Files\Java\jdk1.8.0_91】{备注:JDK的安装目录}
PATH后添加【%JAVA_HOME%\bin;】
*设置Maven环境变量
下载Maven并解压
系统变量下 { 注:【】只是为了强调说明 }
新建MAVEN_HOME -> 值为【D:\Program Files\apache-maven-3.3.9】{备注:Maven所在目录}
PATH后添加【%MAVEN_HOME%\bin;】
在命令行窗口中,使用mvn -v来查看一下maven的版本信息,如下图所示:
说明maven已经安装配置好了。
接下来说一下Maven的核心:pom文件。
0x02 pom.xml
就像Make的makefile一样,Maven项目的核心是pom.xml。POM(Project Object Model,项目对象模型),定义了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。
在Eclipse中新建一个Maven Project,生成的pom.xml文件如下:
其中groupId,artifactId,version是最重要的,这三个元素定义了一个项目基本的坐标。在Maven的世界,任何的jar,pom或者war都是以基于这些基本的坐标进行区分的。
*groupId -- 定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。比如说,你在github上建立了一个名为myapp的项目,那么groupId就应该是com.github.myapp,如果你的公司是athrob,有一个项目为cloud,那么groupId就应该是com.athrob.cloud。
*artifactId -- 定义了当前maven项目在组中唯一的ID。一般使用"项目名-模块名"来命名。
*version -- 指定了当前maven项目的版本。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如,升级成1.0,2.0-SNAPSHOT,2.0等。{ 注:一般第一个0表示大版本号,第二个0表示分支版本号,第三个0表示小版本号,例:0.0.1,snapshot, -- 快照;alpha, -- 内部测试;beta, -- 公测;release, -- 稳定版GA(General Availability) -- 正式发布的版本 }
其他标签:
*name -- 项目描述名,声明了一个对于用户更为友好的项目名称。虽然这不是必须的,但是推荐为每个pom声明name,以方便信息交流。
*package -- 默认是jar
*description -- 项目描述
*dependency,exclusions,build,plugin,parent,module等见下图所示:
关于依赖,后面我们会具体说一下依赖,依赖的冲突。以及maven的聚合和继承。
0x03 Maven生命周期(clean,default,site)
clean -- 清理项目
default -- 构件项目
site -- 生成项目站点
*clean: 三个阶段
pre-clean -- 执行清理前的工作
clean -- 清理上一次构建生成的所有文件
post-clean -- 执行清理后的文件
*default: (最核心)
主要有这几个阶段:compile,test,package,install
*site:
pre-site -- 在生成项目站点前要完成的工作
site -- 生成项目的站点文档
post-site -- 在生成项目站点后要完成的工作
site-deploy -- 发布生成的站点到服务器上
0x04 Maven仓库
有本地仓库,远程仓库,镜像仓库。
接下来说一下如何修改他们。
本地仓库默认是在~/.m2目录下。{ ~ 表示用户所在的家目录,例:C:\Users\admin\.m2 }
修改maven的conf目录下的settings.xml文件,使用localRepository标签,添加本地仓库的目录,如下图:
这样,我们就把Maven的本地仓库设置为:D:/maven_repo
然后复制settings.xml文件到我们设置的本地仓库目录下。
远程仓库可以理解为Maven的中央仓库:https://repo.maven.apache.org/maven2
通过打开lib目录下的maven-model-builder-3.3.9.jar包,依次进入org\apache\maven\model,查看pom-4.0.0.xml文件,就可以看到中央仓库的url了。
镜像仓库:
依然是刚才提到的settings.xml,修改其中mirrors,mirror标签里的内容,就可以修改maven的镜像仓库,这里我修改为OSChina的,如下图:
0x05 关于Maven项目
*Maven项目主代码和测试代码:
默认情况下,项目主代码位于src/main/java目录,测试代码位于src/test/java目录。
*自动创建符合maven规范目录的两种方式:
mvn archetype:generate [注:按照提示进行选择]
mvn archetype:generate -DgroupId=组织名、公司网址的反写 + 项目名 -DartifactId=项目名-模块名 -Dversion=版本 -Dpackage=代码所在的包名
*常用的maven命令:
mvn -v -- 查看maven版本
mvn compile -- 编译
mvn test -- 测试
mvn package -- 打包
mvn clean -- 删除target
mvn install -- 安装jar包到本地仓库中
也可以组合起来用,如:mvn clean package
好,接下来,说一说maven中另外一个比较重要的概念:依赖。
0x06 依赖
前面也提到过,在pom.xml文件中使用dependencies和dependency标签,来声明依赖。
首先说一下依赖的范围:(使用scope标签声明依赖的范围)
compile -- 默认的范围,编译测试运行都有效
provided -- 在编译和测试时有效
runtime -- 在测试和运行时有效
test -- 只在测试时有效
system -- 与本机系统相关联,移植性差
import -- 导入的范围,它只使用在dependencyManagement中,表示从其他的pom中导入dependency的配置
接下来用具体的例子来说明依赖,依赖的传递以及排除依赖传递,如下图所示:
A,B,C分别为三个maven项目。
使用exclusions,exclusion标签来声明排除依赖传递
接下来,说一下关于依赖的冲突。(即声明了相同的构件,不同的版本)
两条原则:
1.短路优先
A -> B -> C -> X(jar)
A -> D -> X(jar)
会优先解析路径短的版本
2.先声明,先优先
如果路径长度相同,则谁先声明,先解析谁
依然以图示例,这样会更好理解一些,如下图所示:
A,B,C为三个Maven项目
1. 短路优先
2. 先声明,先优先
0x07 聚合和继承
*聚合
我对聚合的理解就是一个maven项目能够直接对其他所有模块项目进行管理和构建。
如下图所示:
A,B,C为三个maven模块项目,新建一个all项目,通过modules,module标签声明聚合。
通过对all这个项目的maven build...就实现对其他三个项目的构建。查看控制台信息,如下:
这样就不用对每个模块逐个进行构建。可以看到A,B,C均构建成功。
*继承
跟java中继承的概念很相似,还是以图示例,见下图:
可以看到,A没有依赖,parent依赖junit-3.8.1.jar。
在A的pom.xml中使用parent标签表现来声明继承parent,如下图:
可以看到,此时A就继承了parent对junit-3.8.1.jar的依赖。
0x08 使用Eclipse新建一个Maven Project之webapp
首先要安装m2eclipse插件:
在Eclipse IDE中,Help -> Install New Software... -> Add
Name: m2e
Location: http://m2eclipse.sonatype.org/sites/m2e
注:不要使用IDE内嵌的MAVEN插件
Windows -> Perferences -> Maven -> Installations 【取消使用IDE内嵌的Maven插件,选择Add添加Maven的安装目录】
然后更改Maven的User Settings。这里选择本地仓库的settings.xml文件。
然后我们开始新建一个Maven Project
Select an Archetype这一步,选择webapp
填写groupId,artifactId,version,package等信息。
等个一两分钟,项目就创建好了,但是会报一个jsp error的错误。这是因为,缺少了一个类。
解决办法如下图,添加Java Servlet API的依赖就好了:
此时,就OK了。剩下的可以自由发挥了。
0x09 其他
上面我们创建好的Maven Project,发现没有src/main/java和src/test/java文件夹,只有一个src/main/resource文件夹。
我们更改一下项目的JRE System Library就好了。
可以看到,此时就有src/main/java和src/test/java两个文件夹了。
使用jetty插件
访问http://localhost:8080
使用tomcat插件
上面这里部署了在package阶段运行。
访问http://localhost:8080/webdemo
完!
不足之处,请批评指正。
如有问题,请私信联系。
谢谢!