前言
此文众多内容来自Maven实战一书,该书系统的介绍了maven相关方便知识。还有工作中遇到的问题,以及解决方法,我这里也是将我的理解记录下来,方便日后使用。
本文除非必须(如问题记录等),尽量以文字叙述。
1.Maven是什么?
Maven是Apache下一个开源的项目构建工具,它抽象了一个完整的构建生命周期模型(如下).
1.清理:
2.编译:
3.测试:
4.生成报告:
5.打包:
6.部署:
2.为什么要使用Maven?
1.简化开发环境搭建,如jar包引入。
2.规范项目开发流程,以及项目规范。
3.敏捷开发。
3.如何使用Maven?
3.1maven下载与安装(windows)
(1)下载安装:
确保本机有java环境,因为maven需要它,且对版本还有要求,官网下载链接里System Requirements里面有说明,Files栏目下选择apache-maven-3.6.2-bin.zip二进制包即可。下载后直接解压到某个文件夹下即可。
(2)环境变量配置:
我的电脑(右键)-->属性(右下方)-->高级环境设置(左边栏目)-->环境变量(左下方)-->系统变量栏目下新建一个系统变量,变量名:M2_HOME,变量值:你maven解压的目录绝对路径(也就是包含bin目录的文件路径)-->确定。
然后还是在系统变量栏目下找到Path变量,编辑它,在尾部加入%M2_HOME%\bin。这步的含义是,将maven的bin目录添加到系统环境当中,其中M2_HOME就是我们刚才配置的maven安装路径,而bin目录下就是maven可执行的命令。所以配置好后,我们就可以在dos界面下使用maven命令了,注意maven命令以mvn开头(因为他运行的是bin目录下的mvn.cmd命令)如mvn -version,他会获取maven相关信息,如版本和安装路径。
C:\Users\Administrator>mvn -version Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:13+08:00) Maven home: E:\Develop\maven\apache-maven-3.5.2\bin\.. Java version: 1.8.0_181, vendor: Oracle Corporation Java home: E:\Develop\java\jdk1.8.0_181\jre Default locale: zh_CN, platform encoding: GBK OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" |
3.2maven相关配置
3.2.1maven属性配置文件(settings.xml)
位置:maven安装目录下的conf目下,此目录下的配置文件是全局配置文件,更改后会影响所有系统用户。
与之对应的是maven可以设置多用户配置,也就是不同的用户可以有不同的settings.xml配置,将上线的settings.xml文件copy到C:\Users\Administrator\.m2\目录下,则当前用户会采取该目录下的settings.xml中的配置,若没有则会采用全局配置。
下面我们看看settings.xml中有哪些配置,以及作用。其实该文件里就有相关的配置说明,以及示例,当然它们处于注释状态。我们以settings.xml文件中标签出现的位置来进行说明,标签概念说明请看3.3节.
标签 |
作用与说明 |
示例 |
<localRepositor/> |
本地仓库位置:默认为.m2/repository目录下,可修改为与maven解压相同目录,方便日后修改。 |
<localRepository> E:\Develop\maven\maven-repository </localRepository> |
<interactiveMode/> |
交互模式,默认true。可以理解为是否有提示 |
<interactiveMode>true</interactiveMode> |
<offline></offline> |
是否不联网,默认false |
<offline>false</offline> |
<pluginGroups/> |
插件的GroupId,pom文件中未写grouId则会从这里查找。默认包含org.apache.maven.plugins和 org.codehaus.mojo. |
<pluginGroups> <pluginGroup>org.eclipse.jetty</pluginGroup> </pluginGroups> |
通过代理访问外网 可以看到,我们能配置多个proxy,通过active=true来决定哪个代理生效。需要说明的是,nonProxyHosts标签指的是不需要代理的主机。比如我们访问公司内网上的私服,则完全没必要使用内网。 |
<proxies> <proxy> <id>optional</id> <active>true</active> <protocol>http</protocol> <username>proxyuser</username> <password>proxypass</password> <host>proxy.host.net</host> <port>80</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> </proxies> |
|
<servers/> |
配置下载和部署的主机。比如进行部署操作时,主机认证的用户名和密码可写入此文件中,避免暴露到pom文件中。 id:连接远程仓库/镜像id privatekey:鉴权时使用的私钥位置 passphrase:鉴权时使用的私钥密码。 filePermissions: 文件被创建时的权限。如果在部署的时候会创建一个仓库文件或者目录,这时候就可以使用权限(permission)。这两个元素合法的值是一个三位数字,其对应了unix文件系统的权限,如664,或者775。 directoryPermissions:目录权限 *:根据官网介绍,如果使用private key方式请忽略password标签,否则被其覆盖,即采用密码模式 |
<servers> <server> <id>server001</id> <username>my_login</username> <password>my_password</password> <privateKey>${user.home}/.ssh/id_dsa</privateKey> <passphrase>some_passphrase</passphrase> <filePermissions>664</filePermissions> <directoryPermissions>775</directoryPermissions> <configuration></configuration> </server> </servers> |
<mirrors/> |
maven*仓库镜像,也就是我们下载jar其他的地方,比如阿里云,或者企业自己搭建的私服,如果需要密码,则需要配置上线的server标签。这里指的注意的是mirrorOf标签,当我们配置多个镜像时,可在这里采取过滤,如*,!repo1:匹配除id为repo1的所有仓库 |
<mirrors> <mirror> <!-- 阿里云仓库 --> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url> http://maven.aliyun.com/nexus/content/repositories/central/ </url> </mirror> </mirrors> |
<profiles/> |
根据环境调整配置。这里可以看做是全局的配置,但我们常在pom文件中配置该选项,因为具体的项目我们才知道具体的差异配置。 |
<profiles> <profile> <id>env-dev</id> <activation> <property> <name>target-env</name> <value>dev</value> </property> </activation> <properties> <tomcatPath>/path/to/tomcat/instance</tomcatPath> </properties> </profile> </profiles> |
<activeProfiles/> |
指定激活的profile |
<activeProfiles> <activeProfile>alwaysActiveProfile</activeProfile> <activeProfile>anotherAlwaysActiveProfile</activeProfile> </activeProfiles> |
3.3maven相关概念介绍与使用
3.3.1maven坐标与依赖
怎样才能准确的引入我们需要版本的第三方的jar呢?
答:maven通过groupId(组织Id)、artifactId(项目模块Id)、version(项目版本)、packaing(打包方式)等元素来确定一个jar。其格式如下
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12-beta-3</version>
<!--依赖范围-->
<scope>test</scope>
<!--去除某个依赖-->
<exclusions>
<exclusions>
<groupId></groupId>
<artifactId></artifactId>
<exclusions/>
</exclusions>
</dependency>
这里我们需要关注的是该jar的依赖范围,具体取值与依赖范围如下图
pom路径下执行下面命令可分析项目依赖:
mvn dependency:tree 以树形式展示项目依赖
mvn dependency:analyze 分析项目依赖,有时候我们可能编译,打包不会报错,但是运行就会报错。
3.3.2maven仓库
maven仓库就是存放jar的位置,可分为远程仓库与本地仓库。
本地仓库:配置可回看settings.xml中的配置,需要注意的是一台笔记本配置一个本地仓库就好,避免资源浪费,特别是使用ide编译器,一定要将仓库设置为本地仓库位置。
远程仓库配置:可在pom文件中配置,但如果之前的mirror配置为*,那么会忽略pom中的配置,若远程仓库需要认证,则可结合settings.xml中的servers来配置账号密码,通过id来关联。
部署至远程仓库:具体配置与含义查看下表
远程仓库配置 |
<repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> |
部署至远程仓库 |
<!-- 使用分发管理将本项目打成jar包,直接上传到指定服务器 --> <distributionManagement> <!--正式版本--> <repository> <!-- nexus服务器中用户名:在settings.xml中<server>的id--> <id>yang</id> <!-- 这个名称自己定义 --> <name>Release repository</name> <url>http://192.168.1.105:8081/repository/yang/</url> </repository> <!--快照 <snapshotRepository> <id>nexus-snapshots</id> <name>Snapshots repository</name> <url>http://192.168.1.105/repository/yang/</url> </snapshotRepository>--> </distributionManagement> |
常见远程仓库 可下载上传需要的jar |
3.3.3maven生命周期
test生命周期
生命周期阶段 |
描述 |
pre-clean |
执行一些清理前需要完成的工作 |
clean |
清理上一次构建生成的文件 |
post-clean |
执行清理后需要完成的工作 |
default生命周期:
生命周期阶段 |
描述 |
validate(校验) |
校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) |
初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) |
生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) |
处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) |
生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) |
复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) |
编译项目的源代码。 |
process-classes(处理类文件) |
处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) |
生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) |
处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) |
为测试创建资源文件。 |
process-test-resources(处理测试资源文件) |
复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) |
编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) |
处理测试源码编译生成的文件。 |
test(测试) |
使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) |
在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) |
将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) |
在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) |
处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) |
在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) |
运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) |
安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) |
将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
site生命周期:
生命周期阶段 |
描述 |
pre-site |
生成站点前需要完成的工作 |
site |
生成站点文档 |
post-site |
生成站点文档后需要完成的工作 |
site-deploy |
将生成的项目站点发布到服务器上 |
3.3.4maven插件
丰富maven功能,如实现源码打包功能。插件执行与绑定的maven生命周期有关。
<build>
<plugins>
<plugin>
<artifactId>maven-source-plugin</artifactId>
<version>2.1.1</version>
<!-- 插件执行的任务 -->
<executions>
<execution>
<!--任务id-->
<id>attach-sources</id>
<!--插件绑定的生命周期为verify阶段-->
<phase>verify</phase>
<!--执行的插件-->
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
除上线pom文件中配置插件方式外,还可采用命令行的形式配置插件如
mvn install -Dmaven.test.skip=true : 运行时跳过测试。
插件仓库:可通过配置pluginRepositories节点来设置
3.3.5聚合与继承
聚合:兄弟模块<modules>
继承:父子模块<parent>
3.3.6maven测试
基本测试文档:maven-surefire-plugin
测试覆盖率报告:cobertura-maven-plugin