浅谈Maven的build生命周期和常用plugin

简介

Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可。

今天我们要讨论一下mvn命令之下的生命周期的构建。

lifecycle和Phases

所谓lifecycle,可以理解为可以执行一组命令的集合,用来执行具体的某些操作。

Maven默认有三种lifecycle:default,clean和site。default主要用来处理项目的开发,clean主要用来负责项目的清理,site主要用来生成项目的文档。

lifecycle是由一个或者多个phase组成的。

以default为例,它大概由23个phases组成,这些phases将会按顺序执行来完成default的lifecycle。

我们选取default lifecycle中非常常见的几个phase来说明一下:

  • validate - 用来验证项目是否正确或者项目所需要的信息是否可用。
  • compile - 用来编译项目代码
  • test - 执行代码中的单元测试
  • package - 将编译后的代码进行打包,打包可有很多种方式,比如:jar,war等
  • verify - 执行集成测试
  • install - 将项目安装到本地仓库中,供有依赖关系的其他项目使用
  • deploy - 将项目部署到远程仓库,以便共享给其他的用户

上面的phase执行是有顺序的,比如我们如果执行mvn verify,则会顺序执行validate,compile,test和package。

Phases和Goals

Phases是一种任务的集合,它是由一个或者多个Goals组成的。Goals可以包含在Phases里面执行,也可以单独用命令执行。

那么Goals又是从哪里来的呢?Goals是定义在maven中的plugin中的。

我们看下面一张直观的图:

下图列出了现有lifecycle中的phase,和相应phase所对应的plugin。

我们可以看到基本每个phase都和一个plugin中的golas是相对于应的。

除了使用命名直接指定要执行的phase以外,还可以直接指定goals:

mvn clean dependency:copy-dependencies package

上面的命令中clean和package是phase,而copy-dependencies则是goals。

常用plugin介绍

这里我们介绍两个非常常用的maven plugin,maven-dependency-plugin和maven-jar-plugin。

maven-dependency-plugin

maven中的依赖jar包是存放在maven的本地仓库中的,如果项目中依赖了某些jar包,在部署的时候还需要这些依赖的jar包拷贝出来,非常不方便,有了maven-dependency-plugin,则可以借用它的copy-dependencies来将项目的依赖jar包拷贝出啦,如下所示:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.1.2</version>
    <executions>
        <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>
                    ${project.build.directory}/lib
                </outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

goals是和相应的phase相关联的,在上面的例子中,我们将copy-dependencies和package相关联,则在我们执行mvn package的时候就会自动执行copy-dependencies,从配置文件可以知道,我们将会把项目的依赖jar包拷贝到项目的build目录的lib目录下。

maven-jar-plugin

有了依赖的lib,可以将main程序打包成为一个可执行的jar包。这时候我们就需要使用到maven-jar-plugin。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>com.flydean.MavenClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

为了生成可执行的jar包,我们需要在MANIFEST.MF文件中添加mainClass文件的路径,这样在执行jar包的时候,无需额外的参数即可运行。

遗憾的是,如果我们的class文件用到了外部jar包的依赖时候,jar包直接运行会出错,因为找不到所依赖的jar包。

在介绍maven-dependency-plugin的时候,我们已经把所用到的lib拷贝出来了,这里我们可以直接使用:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.flydean.MavenClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

多加了两个addClasspath的参数,我们将打包好的jar包解压缩。

可以看到里面多了一个MANIFEST.MF的文件:

Manifest-Version: 1.0

Created-By: Maven Jar Plugin 3.2.0

Build-Jdk-Spec: 14

Class-Path: lib/lombok-1.18.10.jar lib/logback-classic-1.2.3.jar lib/log

 back-core-1.2.3.jar lib/slf4j-api-1.7.25.jar

Main-Class: com.flydean.MavenClass

这个文件里面包含了一些jar包的元数据,并且里面添加了Class-Path和Main-Class文件,这时候执行运行jar包就可以直接执行了。

以上就是浅谈Maven的build生命周期和常用plugin的详细内容,更多关于Maven的build生命周期和常用plugin的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java使用Maven BOM统一管理版本号的实现

    一个中大型的 Java 项目往往包含若干 JAR 包,这些 JAR 包有着不同的版本号.如果这些 JAR 包单独发布,然后直接通过版本号引用相应的 JAR 包,不同版本的兼容性维护将变得十分麻烦.为了解决这个问题,可以让一个特殊的模块引用这些 JAR 包,将版本号定义在这个模块中,模块中的 JAR 都是兼容的,对外发布时只发布这个特殊模块.这个特殊模块就是 BOM(Bill Of Materials). 著名的 Spring Boot 就使用了这种方式来管理版本号,这个模块就是 spring-b

  • 详解idea maven nexus 常见命令配置

    maven 常见命令配置 maven常用命令 #创建项目 -D设置参数 mvn archetype:generate -DgroupId=cn.dwcode -DartifactId=dw.test.biz -Dversion=1.0.0 #创建项目 -B批处理模式构建项目 mvn archetype:generate -B -DgroupId=cn.dwcode -DartifactId=dw.test.biz -Dversion=1.0.0 mvn clean mvn compile mvn

  • Jenkins+maven持续集成的实现

    环境 系统:centos 7 tomcat位置:/usr/local/jbreport/apache-tomcat-8.5.57 jdk位置:/usr/local/jbreport/jdk1.8.0_152 安装Jenkins 下载依赖 wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo 导入密钥 rpm --import https://pkg.jenkins.io/re

  • IDEA 2021版新建Maven、TomCat工程的详细教程

    2021版IDEA中Maven.TomCat配置 环境:IDEA:2021.1 Maven 3.8.1 在java开发中,需要使用大量的jar包,需要我们手动导入 Maven可以用来自动导入和配置jar包 1.基于Webapp创建一个Maven项目 1.1 新建项目模板 1.2 指定名称 1.3 指定信息 1.4 指定Maven地址 1.5 构建成功 如果Idea没有自动下载,右下角有个Enable Auto-Import可以点击,表示自动导入包,等待项目初始化完毕,直到显示success表示加

  • Java基础之Maven详解

    一.Maven环境的搭建 1. 为什么要学习Maven? 2.  Maven项目架构管理工具 3.  下载安装Maven 下载完成后解压 4.  配置环境变量 在我们的系统环境变量中 配置如下配置: - M2_HOME maven目录下的bin目录 - MAVEN_HOME maven的目录 - 在系统的path中配置 %MAVEN_HOME%\bin 测试Maven是否安装完毕,必须保证配置完成 5. 阿里云镜像配置 <mirror> <id>nexus-aliyun</i

  • Idea配置Maven阿里云镜像加速的实现

    如果没有安装过maven,是用的idea自带的maven,那就是idea的安装目录下 /plugins/maven/lib/maven3这个目录. 然后在conf下打开settings.xml,加入如下代码: <mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https:/

  • Java基础之初识Maven

    一.为什么使用Maven? 首先我们先灵魂拷问一下jar包是什么?我们可以将它理解为我们写的一个Java程序,整个Java程序中由多个Java文件和依赖组成.了解清楚这个之后,接下来介绍我们为什么要使用Maven 很多小伙伴学习完Maven之后还是有个疑问,它是干什么用的?所以进入今天的内容前,我先按照自己的理解说明一下Maven Maven相当于一个仓库管理员,它有本地仓库和云端仓库两个仓库与,它在本地仓库中管理着我们创建的jar包,同样的,我们可以通过远程仓库来使用别人的jar包,当然了,它

  • idea导入maven工程的三种方法

    前言 博主发现idea中有几种不同的导入项目的方法,特此记录一下,供大家参考 提示:以下是本篇文章正文内容,下面案例可供参考 第一种导入项目的方法 第二种导入项目的方法 第三种导入项目的方法 示例点击下载 总结 博主建议使用第三种导入方式,导入maven项目,不会改变maven的项目结构 到此这篇关于idea导入maven工程的三种方法的文章就介绍到这了,更多相关idea导入maven工程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

  • 教你如何把Eclipse创建的Web项目(非Maven)导入Idea

    问题描述 无论任何项目,在切换IDE工具时经常出现各种报错.异常的卡壳现象,其实大多都是因为两个IDE之间运行环境或依赖库的差异引起的!本文以把Eclipse创建的项目导入到Idea为例,希望对大家解决该类问题有所帮助! 一.复制Eclipse项目 采用复制方式是为了避免失误操作导致文件丢失,可以直接复制项目文件夹到任意非不包含中文和空格的路径. 若不知道项目路径在哪,可打开eclipse,选中待导出项目,快捷键 ALT + SHIFT + W, 点击System Explorer打开项目路径

  • 浅谈Maven的build生命周期和常用plugin

    简介 Maven为我们封装了很多构建中非常有用的操作,我们只需要执行简单的几个mvn命令即可. 今天我们要讨论一下mvn命令之下的生命周期的构建. lifecycle和Phases 所谓lifecycle,可以理解为可以执行一组命令的集合,用来执行具体的某些操作. Maven默认有三种lifecycle:default,clean和site.default主要用来处理项目的开发,clean主要用来负责项目的清理,site主要用来生成项目的文档. lifecycle是由一个或者多个phase组成的

  • 浅谈angular2 组件的生命周期钩子

    本文介绍了浅谈angular2 组件的生命周期钩子,分享给大家,具体如下: 按照生命周期执行的先后顺序,Angular生命周期接口如下所示 名称 时机 接口 范围 ngOnChanges 当被绑定的输入属性的值发生变化时调用,首次调用一定会发生在 ngOnInit之前. OnChanges 指令和组件 ngOnInit 在第一轮 ngOnChanges 完成之后调用. ( 译注:也就是说当每个输入属性的值都被触发了一次 ngOnChanges之后才会调用 ngOnInit ,此时所有输入属性都已

  • 浅谈Vuex注入Vue生命周期的过程

    这篇文章是[前端词典]系列文章的第 13 篇文章,接下的 9 篇我会围绕着 Vue 展开,希望这 9 篇文章可以使大家加深对 Vue 的了解.当然这些文章的前提是默认你对 Vue 有一定的基础.如果一点基础都没有,建议先看官方文档. 第一篇文章我会结合 Vue 和 Vuex 的部分源码,来说明 Vuex 注入 Vue 生命周期的过程. 说到源码,其实没有想象的那么难.也和我们平时写业务代码差不多,都是方法的调用.但是源码的调用树会复杂很多. 为何使用 Vuex 使用 Vue 我们就不可避免的会遇

  • 浅谈Maven的安装及修改为阿里云下载依赖

    使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办? 换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻? 自己写的代码放在别人的机器上运行会不会出问题? Maven的强大毋庸置疑,当使用Maven后以上这些都不是问题,但是配置maven是一件耐心的事情,基本步骤总结如下: 一.下载 http://maven.apache.org/download.cgi 也可以直接在eclipse工具中下载,点击eclipse菜单栏Help->Eclipse Marketplace搜

  • 浅谈maven单元测试设置代理

    背景 环境需要设置代理才能够访问外部网络,如果只是运行java程序来访问网络,我们可以通过java -jar test.jar -DproxyHost=proxy_ip -DproxyPort=proxy_port,但如果是java的maven项目中,单元测试需要访问网络,只执行mvn test则会导致单元测试的代码无法访问网络. 解决 Maven单元测试,使用的是Surefire Maven插件.当Surefire插件fork JVM时,并不会继承所有的系统属性.因此我们可以通过命令行来如下设

  • 浅谈maven的jar包和war包区别 以及打包方法

    jar文件包括java普通类.资源文件和普通文件,在maven中即是打包src/main/java和src/main/resources资源文件夹下的所有文件.在打包的时候会自动生成MATA-INF文件夹,用于存储maven的pom信息和MANIFEST.MF文件.例如: war文件包含全部的web应用程序,即所有的java类,配置信息和jsp.js等静态资源.但是需要注意war引用war的时候会将应用war的资源全部拷贝到当前war的相同文件下,重名的文件会被替换.例如: war包依赖: <d

  • 浅谈Maven包冲突的原理及解决方法

    1.概述 Apache Maven ,是一个软件(特别是Java软件)项目管理及自动构建工具.在没有Maven的上古年代,项目中引入jar包需要手动下载一个个的去下载,但是随着代码数量的增加,引入的jar包数量自然会增加,随之而来的就是jar包冲突的问题了. 2.产生jar包冲突的原因 众所周知,一个项目中不能存在两个全限定类名一致的Class类,并且jar包的本质就是打包好的Class类文件,例如: 将 junit-jupiter-api-5.6.2.jar 文件解压后, 可以得到多个Clas

  • 浅谈Maven安装及环境配置出错的解决办法

    可能导致安装不成功的原因: 添加 系统变量的时候,M2_HOME路径没有在尾部加上\bin,而是把\bin在PATH路径的尾部加上了,比如下图某教程教的,这样做可能导致环境变量配置不成功. 安装和环境配置步骤 一.准备工作 1.jdk7.0以上版本 2.win10操作系统 3.maven安装包 二.解压安装包到指定文件夹 我的安装包解压到了C:\WorkSoftware\apache-maven-3.5.2 三.配置环境变量 C:\WorkSoftware\apache-maven-3.5.2

  • 浅谈Maven Wrapper

    简介 开发java项目少不了要用到maven或者gradle,对比gradle而言,可能maven要更加常用一些.要使用maven那就必要要安装maven,如果有些用户不想安装maven怎么办?或者说用户不想全局安装maven,那么可以使用项目级别的Maven Wrapper来实现这个功能. 如果大家使用IntelliJ IDEA来开发Spring boot项目, 如果选择从Spring Initializr来创建项目,则会在项目中自动应用Maven Wrapper.简单点说就是在项目目录下面会

  • 浅谈layer的Icon样式以及一些常用的layer窗口使用方法

    本文搜集的是本人在实际开发中所用到的layer窗口,未用到的layer按钮,请参考layer官网:http://layer.layui.com/ 一.layer的icon样式 以上样式测试代码: layer.confirm('icon测试', {icon: 1, title:'提示'}, function(index){ //do something alert("确认"); layer.close(index); }); 二.询问框 官方案例: //询问框 layer.confirm

随机推荐