Maven使用简介

前言

此文众多内容来自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的依赖范围,具体取值与依赖范围如下图

Maven使用简介

 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

https://mvnrepository.com

     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

3.3.7maven构建

3.3.8maven生成项目站点

  3.4maven其他方面

3.4.1Nexus私服

3.4.2Archetype

3.4.3maven插件

4.遇到问题记录

上一篇:Cookie与Session


下一篇:Git简介与安装