一、初识Maven

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

优点:

1>  简单

2>  持续集成CI

3>  构建简单

4>  插件丰富 

5> 约定优于配置

二、下载安装

下载:官网http://maven.apache.org/ 下载即可

安装:将下载好的包解压、配置环境变量即可

Maven加载配置文件的优先级:用户目录/.m2/settings->自己安装的Maven下的config/settings.xml

三、pom.xml常用节点的含义

modelVersion:找到你安装maven的路径:org/apache/maven/model下的pom,超级pom的version版本

groupId:一般配置的是公司域名

artifactId:这个项目的功能

version:version的定义是很讲究的,后续会影响合测试人员的沟通成本、效率

packaging:打包的方式,默认是打成jar包

name:项目展示的名称

description:对该项目的描述

parent:parent pom

properties:定义parent pom中的变量

exclusions:一般是为了解决jar包冲突的问题

dependencyManagement:一般只会出现在父pom中、统一版本号,声明式;在其中管理的jar包,其他module直接引用即可无需添加版本号

dependency:其中的scope的含义与案例

1、compile编译:默认不写就是scope

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>4.3.17.RELEASE</version>
</dependency>

2、test 测试

<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
   <scope>test</scope>
</dependency>

3、provided:编译,不会打包

<dependency>
   <groupId>org.apache.tomcat</groupId>
   <artifactId>tomcat-servlet-api</artifactId>
   <version>7.0.84</version>
   <scope>provided</scope>
</dependency>

4 runtime:运行时有效

<!-- 基于jdbc提供接口,这里只是实现 -->
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.6</version>
   <scope>runtime</scope>
</dependency>

5、system :需要外在提供相应的元素,通过systemPath来取得 不建议使用新的版本这个元素有可能会被覆盖掉。本地jar包不在maven仓库中的,比如自己写的jar包其他项目想依赖怎么办:上传到私服,install到本地,add classpath

四、依赖原则

通过具体的列子解释,项目的结构图及依赖关系:

1>最短路径原则

考虑这种场景:

conan-web->conan-core->conan-common

查看conan-web的依赖关系:mvn dependency:tree>tree.txt


2>在conan-web pom.xml中添加common包查看依赖关系

<dependency>
   <groupId>com.aisky</groupId>
   <artifactId>conan-common</artifactId>
</dependency>

这个时候可以看conan-web直接依赖于conan-common,而不是通过conan-core再依赖conna-web

2>加载顺序原则

conan-web pom.xml的配置如下:

假设conan-core依赖conan-common 的版本升级到了1.1,这个时候conan-web中依赖的conan-common的版本是多少呢?

根据下图可以看到是1.1的版本,这是因为conan-core在conan-web的pom.xml中配置的加载顺序要在conan-adaptor之前。

五、常用的插件

1、上面提及了修改版本号的问题,这里可以引入如下插件

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>versions-maven-plugin</artifactId>
  <version>2.3</version>
</plugin>

执行:

mvn versions:set -DnewVersion=1.0-SNAPSHOT 这个命令子模块都会改变,如果担心子模块没有更新则执行:mvn versions:update-child-modules

回退版本号:mvn versions:revert

2、findbugs插件

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>findbugs-maven-plugin</artifactId>
   <version>3.0.0</version>
   <configuration>
     <threshold>High</threshold>
     <effort>Default</effort>
     <findbugsXmlOutput>true</findbugsXmlOutput>
     <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>
   </configuration>
</plugin>

运行mvn fingbugs:fingbugs 会看到findbugsXml.xml这里不好观察,可以用mvn fingbugs:gui

意思是list没有被使用,轻量级的静态bugs扫描可以选用findbugs,后续可以用sonar进行扫描;还有其他一些常用的tomcat插件,assembly插件就不一一列举的,提供如下查找plugin的地址

https://maven.apache.org/plugins/

http://www.mojohaus.org/plugins.html

六、Maven打包

一般我们的项目都会有很多环境的配置文件比如dev、test、pro,我们在conan-web项目新增三个配置文件项

pom.xml配置

例如dev的:mvn package -P dev,查看target下配置文件为application-dev.properties验证成功

七、LifeCycle、Phase、Goal的区别

三者的区别可以用下面两句话概括:

A Build Lifecycle is Made Up of Phases

A Build Phase is Made Up of Plugin Goals

一个生命周期包含多个阶段,一个阶段中可以由多个goal组成。

Maven把项目的构建划分为不同的生命周期,常见的生命周期有下图的:clean Lifecycle,Default Lifecycle ,Site Lifecyle,比如Clean Lifecycle中的clean就是一个phase,phase是按顺序执行的。

goals:执行任务的最小单元,它可以绑定到任意个phase中,一个phase有一个或多个goal,goal也是按顺序执行的,一个phase被执行时,绑定到phase里的goal会按绑定的时间被顺序执行。

八、版本管理

各个公司的版本命名规范可能不一致,常见的可能有:主版本号.次版本号.增量版本号-<里程碑版本>,比如1.0.0-RELAESE。

工作中经常看到这种场景:

假设conan-web目前依赖于一个api包版本为1.0-SNAPSHOT,后续某人对api包的接口变更了,比如某个接口多了个入参通知到你了,这个时候需要去更新最新的包,现在工作中很多人是直接把本地仓库的api包删除再重新拉取,这个效率就太低了,可以使用mvn clean package -U 强制去远端拉取一次

九、自定义插件

step1:新建maven项目

step2:修改packaging标签为:<packaging>maven-plugin</packaging>

step3:引入如下dependency

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>3.5.0</version>
  </dependency>
<dependency>
<dependency>
  <groupId>org.apache.maven.plugin-tools</groupId>
  <artifactId>maven-plugin-annotations</artifactId>
  <version>3.5</version>
  <scope>provided</scope>
</dependency>

step4:新建一个mojo继承AbstractMojo

/**
 * Created by aisky on 2018/8/7.
 * @Mojo 定义插件的相关信息
 */

@Mojo(name="conan",defaultPhase = LifecyclePhase.PACKAGE)
public class XyMojo extends AbstractMojo{

    @Parameter
    private String msg;

    @Parameter
    private List<String> options;

    public void execute() throws MojoExecutionException, MojoFailureException {

        System.out.println("conan"+msg);
        System.out.println("conan "+options);

    }
}

step5:运行拆建

在一个项目引入该插件并运行


这里xuanyuan:conan就叫一个goal,在目前的情况下除非单独运行这个插件在其他任何情况下都不会运行比如mvn install时候也不会运行,插件需要挂载到phase上才会运行

这个时候执行mvn compile该plugin是不会运行的,因为自定插件是LifecyclePhase.PACKAGE的,参考上面的生命周期图complie是在package之前install是在package之后的

我们可以看到打印的信息是conannull

如何传入msg信息,参考下图

传List

运行

十、搭建仓库

这里用的nexus-2.11.2-03-bundle.tar.gz的包

wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.2-03-bundle.tar.gz

下载解压安装就行了,不能用root用户起,在/ect/profile加上export RUN_AS_USER=root,默认端口号是8081,用户名/密码:admin/admin123

配置settings文件

把xuanyuan-plugin上传到仓库中,pom.xml添加

<distributionManagement>
  <repository>
    <id>nexus-releases</id>
    <name>Nexus Release Repository</name>
    <url>http://10.5.236.232:8083/nexus/content/repositories/releases/</url>
  </repository>
  <snapshotRepository>
    <id>nexus-snapshots</id>
    <name>Nexus Snapshots Repository</name>
    <url>http://10.5.236.232:8083/nexus/content/repositories/snapshots/</url>
  </snapshotRepository>
</distributionManagement>

执行命令mvn delopy,验证

11、总结

大家想深入学习Maven的话可以看看《Maven实战》这本书,最后列出常用的Maven命令

compile:编译

clean:把项目下的target删除

test:运行项目中的test case

package:打包默认jar

install: 把项目install到本地仓库

deploy:把本地的jar包发布到私服上

mvn dependency:tree:查看依赖关系,可以解决日常很多问题了,比如 class not found这种问题

mvn clean package -U:强制去远端拉取最新的jar包

mvn versions:set -DnewVersion=xxx:修改版本号

参考文章

许晓斌《Maven实战》

最后,给大家推荐一下作者Aisky的个人公众号,如果你对于这篇文章有兴趣的,不妨关注看看!

温馨提示:

我创建了一个技术交流群,群里有各个行业的大佬都有,大家可以在群里畅聊技术方面内容,以及提供较好的内推机会;如果有想加入的伙伴加我下面微信号,备注一下“技术群”,不备注的不通过!(另外如果需要投稿技术文的小伙伴,也可以加我好友,备注:投稿 。一般在我这边投稿,我会尽最大能力多渠道推广好的)

原创文章不易,如果觉得写得好,扫码关注一下点个赞,是作者最大的动力。好东西记得随手分享给身边的朋友哈,他们会感激你的!

最后关注我,一定会有意想不到的东西等你:

有帮助的话,就动动您的小指头分享点赞一下呗!

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐