Maven实战:Maven生命周期

前言

之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的。

随着工作的深入,越来越感觉对于Maven的理解不够,很多时候使用Maven出了问题都无法很快地解决,因此打算深入地从搭建Maven工程开始学习一下Maven,这篇文章就将自己的学习历程记录下来和网友朋友们分享。

从搭建最简单的Maven项目开始

LZ使用的是MyEclipse,那么就是用MyEclipse搭建一个简单的Maven项目。第一步,new一个Maven Project:

点击next:

这里不推荐勾选"Create a simple project(skip archetype selection)",这样就可以使用很多Maven Archetype,也就是Maven原型,点击next:

看到这里出现了很多Maven推荐给开发者的原型,"org.apache.maven"开头的都是maven官方推荐的,选择一个简单的"maven-archetype-quickstart",接着就是填入一些基本信息:

这些信息填写比较自由,当然之后也会对Group Id、Artifact Id、Version、Package等再做解释,点击finish,MyEclipse就给我们生成好了一个Maven工程:

这就是"maven-archetype-quickstart"原型生成的标准目录结构,"src/main/java"用于编写Java代码、"src/test/java"用于编写测试类,看一下其中最重要的pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org.xrq.mvnstart</groupId>
  <artifactId>hello-world</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>hello-world</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

看到"maven-archetype-quickstart"原型给我们导入了一个junit的jar包,用于单元测试。注意一下,默认生成JUnit版本是3.8.1的,该版本的JUnit不支持注解,后面的单元测试是用的注解,因此把这里改成4.10的版本。

另外,还有个重点就是,最终打包出来的文件类型是一个jar包(packaging)。

OK,那接下来我们就开始编写Java代码以及测试类的代码。

编写主代码及编译

项目主代码和测试代码不同,项目的主代码会被打包到最终的构件中,而测试代码只在运行测试时用到,不会被打包。

生成的工程下,默认有一个App类,稍作修改:

public class App
{
    public String sayHelloWorld()
    {
        return "Say Hello World!";
    }

    public static void main( String[] args )
    {
        System.out.println(new App().sayHelloWorld());
    }
}

代码写完,接着编译,由于Maven使用命令进行操作,因此进入控制台,进入工程目录,输入"mvn clean compile":

此时工程的变化是,在target下有编译好的App.java对应的App.class:

这条命令的意思是:

1、clean告诉Maven清理输出目录target/

2、compile告诉Maven编译项目主代码

从输出中可以看到Maven首先执行了clean:clean任务,删除target/目录;紧接着执行resources:resources任务(因为未定义项目资源,因此此项略过);最后执行compiler:compile任务,将项目主代码编译至target/classes目录。

要说一点,clean:clean、resources:resources、compiler:compile对应了一些Maven插件及插件目标,比如clean:clean是clean插件的clean目标,compiler:compile是compiler插件的compile目标,这在后面的文章中会说明。

编写测试代码及编译

为了保证项目结构清晰,主代码与测试代码应当分别位于独立的目录中。Maven项目中默认的主代码目录是src/main/java,相应地Maven项目中默认的测试代码目录是src/test/java,因此如果在编写测试用例之前没有该目录,应当首先创建该目录。

测试代码为:

public class AppTest
{
    @Test
    public void testSayHelloWorld()
    {
        App app = new App();
        String result = app.sayHelloWorld();
        Assert.assertEquals(result, "Say Hello World!");
    }
}

用了JUnit,上面的pom.xml中依赖项,JUnit的scope是test,这表示JUnit的包只对测试目录是有效的,换句话说,在主目录下使用JUnit将会导致编译报错。

这里还有一个问题要特别说明,由于历史原因,Maven的核心插件之一compiler插件默认只支持编译Java1.3,这个版本并不支持JUnit,因此需要配置该插件使其支持Java5才可以使用JUnit。因此在pom.xml中加入一段:

<build>
      <plugins>
          <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-compiler-plugin</artifactId>
              <configuration>
                  <source>1.5</source>
                  <target>1.5</target>
              </configuration>
          </plugin>
      </plugins>
  </build>

这样就使得插件支持Java5编译。此时命令行中输入mvn clean test:

测试通过,没有问题。

打包

在项目编译、测试通过之后,就会进行一项操作,就是打包(package)。

同样,使用命令行操作,输入"mvn clean package",打包前会先编译、测试,这些信息就不截取了,只看打包的部分:

打包的名字是按照artifactId+version来的,如有需要也可以自定义,这个这里也不讲了。

打包完毕,再看一下工程目录:

多出了一个jar文件,这样就可以在别的地方使用这个jar文件了。

安装

上面生成的jar文件,可以直接复制到别的项目的CLASSPATH下供其他项目使用,那么如何让其他项目直接使用这个jar包呢?可以使用install。

在命令行中输入"mvn clean install",同样我只截取关键的部分:

看到生成的jar和pom被安装到本地仓库中了,只有当构建被下载到本地仓库之后,才能供其他Maven项目使用。这里也是同样道理,只有将Hello World的构件安装到本地仓库之后,其他Maven项目才能使用它。

Maven生命周期

上面的内容,包含了Mavan最主要的命令:mvn clean compile、mvn clean test、mvn clean package、mvn clean install。执行test之前,先执行compile、执行package之前先执行test、执行install之前先执行package,这就涉及到一个概念:Maven生命周期

在Maven中有三套独立的生命周期:

  • Clean Lifecycle:在进行真正的构建之前进行一些清理工作
  • Default Lifecycle:构建的核心部分,编译、测试、打包、部署
  • Site Lifecycle:生成项目报告、生成站点、发布站点

第一个和第三个比较简单也比较好理解,看一下Maven的最重要的Default生命周期,绝大部分工作都发生在这个生命周期中,在这个阶段中,比较重要和常用的阶段有:

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources:复制并处理资源文件至目标目录,准备打包
  • compile:编译项目源代码
  • process-clases
  • generate-test-sources
  • procss-test-sources
  • generate-test-resources
  • process-test-resources:复制并处理资源文件至目标测试目录
  • test-compile:编译测试源代码
  • process-test-classes
  • test:使用合适的单元测试框架测试运行,这些测试代码将不会被打包或部署
  • prepare-package
  • package:接受编译好的代码,打包成可发布的格式,如jar
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install:将包安装至本地仓库,以便让其它项目依赖
  • deploy:将最终的包复制到远程仓库,以便让其它开发人员与项目共享

基本上,只要根据名称我们就可以猜测出每个阶段的用途。要记住的是,任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn clean install的时候,代码会被编译、测试、打包。

此外,Maven的插件机制是完全依赖Maven生命周期的,因此理解生命周期至关重要。

时间: 2024-10-07 06:39:30

Maven实战:Maven生命周期的相关文章

项目构建之maven篇:6.生命周期与插件

项目生命周期 清理 初始化 编译 测试 打包 部署 三套生命周期 1.clean pre-clean 执行一些需要在clean之前完成的工作 clean 移除所有上一次构建生成的文件 post-clean 执行一些需要在clean之后立刻完成的工作 2.compile validate generate-sources process-sources generate-resources process-resources 复制并处理资源文件,至目标目录,准备打包. compile 编译项目的源

【maven详解-生命周期】Maven的生命周期和插件

maven的生命周期是根据我们项目中常见的流程来定义的:清理.编译.测试.打包.集成测试.验证.部署等功能.maven的每个生命周期对应不同的阶段,每个阶段都对应不同的插件. maven定义了三套生命周期:clean.default.site.每个生命周期都包含了一些阶段(phase),三套生命周期相互独立,但各个生命周期中的phase却是有顺序的,且后面的phase依赖于前面的phase.执行某个phase时,其前面的phase会依顺序执行,但不会触发另外两套生命周期中的任何phase. 1

Maven整理笔记の生命周期和插件

项目构建的生命周期,其实软件开发人员每天都在干这个事,即项目清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等,可以说几乎所有项目的构建都可以映射到这样一个生命周期上. Maven的插件机制是完全依赖Maven的生命周期的. 三套生命周期 Maven的生命周期并不是一个整体,Maven拥有三套独立的生命周期,它们分别是clean\default\site.Clean生命周期的目的是清理项目,default生命周期的目的是构建项目,而site的生命周期的目的是建立项目站点. 每个生命

Maven的构建生命周期理解

以下引用官方的生命周期解释https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html: 一.构建生命周期基础: Maven基于构建生命周期的中心概念.这意味着构建和分发特定工件(项目)的过程被明确定义. 对于构建项目的人员,这意味着只需要学习一小堆命令即可构建任何Maven项目,POM将确保他们获得所需的结果. 有三个内置的生命周期:默认(default),清洁(clean)和站点(site).在

Maven专题3——生命周期与插件

三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的生命周期阶段时,同一生命周期中前面的阶段也将被执行. clean生命周期 pre-clean clean post-clean default生命周期 validate initialize generate-sources process-sources generate-resources pr

Maven的三大生命周期

一.Maven的三大生命周期 Maven的生命周期就是对所有的构建过程进行抽象和统一.包含了项目的清理.初始化.编译.测试.打包.集成测试.验证.部署和站点生成等几乎所有的构建步骤. Maven的生命周期是抽象的,即生命周期不做任何实际的工作,实际任务由插件完成,类似于设计模式中的模板方法. 二.三套生命周期 Maven由三套相互独立的生命周期,分别是clean.default和site.每个生命周期包括一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段. 1.clean生命周期

maven入门-- part3 生命周期

简介: Maven有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是: Clean Lifecycle 在进行真正的构建之前进行一些清理工作. Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等. Site Lifecycle 生成项目报告,站点,发布站点. Clean: 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段.比如,运行mvn clean ,这个的clean是Clean生

IDEA中Maven项目的生命周期操作说明

目录 clean-清理操作 变化 结论 compile-编译操作 变化 结论 package-打包操作 变化 结论 install-安装操作 变化 结论 deploy-部署操作 IDEA中对Maven项目做了相当好的支持,专门有个Maven的模块用于进行项目的操作: 上图红框中的内容即开发者经常使用的操作,将英文简单翻译过来,其中文分别为Lifecycle(生命周期).clean(清理).validate(验证).compile(编译).test(测试).package(打包).verify(核

maven插件的生命周期的详细说明(两)

插件配置 定义解释:插件目标 当我们了解了maven插件之后.我们发现假设为每个功能编写一个独立的插件显然是不可取的,由于这些任务背后有非常多能够复用的代码.因此,把这些功能聚集在一个插件里,每个功能我们就称之为一个插件目标. 举个样例: maven-dependency-plugin有十多个目标,每一个目标相应了一个功能 分析项目依赖:dependency:analyze 列出项目依赖树:dependency: tree 列出项目全部已解析的依赖:dependency:list POM中插件全

Maven实战——Maven入门

om.xml配置详解 groupId,artifactid,version这三个属性定义了项目的基本坐标. groupId:定义了项目属于哪个组,往往和项目所在的组织和公司有关   一般为:包名artifactId:定义了当前Maven项目在组中的唯一ID   一般为:项目名称version:指定了项目的当前版本  配置如下: <code class="hljs xml has-numbering" style="display: block; padding: 0px