`
leonzhx
  • 浏览: 793450 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第七章 生命周期和插件

阅读更多

1.   Maven 的生命周期就是为了对所有的构建过程进行抽象和统一。这个生命周期包含了项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建步骤。 Maven 的生命周期是抽象的,不做任何实际工作,实际任务都交由插件完成。(这种思想与 template method 非常类似)每个构建步骤可以绑定一个或者多个插件行为。 Maven 为大多数构建步骤编写并绑定了默认插件,如: maven-compiler-plugin maven-surefire-plugin

 

2.  M aven 拥有三套相互独立的生命周期,它们分别是: clean default site 。每个生命周期包含一些阶段 (phase) ,这些阶段是有顺序的,而且后面的阶段依赖于前面的阶段。用户和 Maven 最直接的交互方式是调用这些生命周期的阶段。在调用某一阶段时,该阶段所在的生命周期之前的阶段会首先被执行。但不同周期间的阶段是相互独立的。

 

3.   clean 生命周期的目的是清理项目,它包含三个阶段: pre-clean clean post-clean

 

4.   default 生命周期定义了真正构建时所需要执行的所有步骤,包含如下阶段 : validate initialize generate-soruces process-sources generate-resources process-resources compile process-classes generate-test-sources process-test-sources generate-test-resources process-test-resources test-compile process-test-classes test prepare-package package pre-integration-test integration-test post-integration-test verify install deploy

 

5.   site 生命周期的目的是建立和发布站点,它包含四个阶段: pre-site site post-site site-deploy

 

6.   关于生命周期的详细介绍,可以参考:

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

 

7.   从命令行执行 Maven 任务的最主要方式就是调用 Maven 的生命周期阶段。如 mvn clean deploy site-deploy 调用了 clean 生命周期的 clean 阶段(自动触发 clean 之前的依赖: pre-clean )、 default 生命周期的 deploy 阶段(自动触发 deploy 之前的依赖)以及 site 生命周期的 site-deploy 阶段(自动触发 site-deploy 之前的依赖: pre-site site post-site )。

 

8.   插件以独立的构件形式存在, Maven 会在需要的时候下载并使用插件。

 

9.   一个插件可以完成多个任务(功能),每个功能就是一个插件目标( plugin goal )。如 dependency:analyze 表示插件 maven-dependency-plugin analyze 目标。

 

10.  M aven 生命周期的阶段与插件的目标相互绑定,以完成某个具体的构建任务。 Maven 的核心为一些主要的生命周期阶段默认绑定了很多插件目标,可以参考 :

http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings

查看具体的绑定关系。由于项目的打包类型会影响构建的具体过程,因此 default 生命周期的阶段与插件目标的绑定关系由项目打包类型决定。

 

11.   POM 中自定义生命周期阶段与插件目标的绑定关系:

 

<build>

  <plugins>

    <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-source-plugin</artifactId>

      <version>2.1.1</version>

      <executions>

        <execution>

          <id>attach-sources</id>

          <phase>verify</phase>

          <goals>

            <goal>jar-no-fork</goal>

          </goals>

        </execution>

      </executions>

    </plugin>

  </plugins>

</build> 
 

可以将 mven-source-plugin 中的 jar-no-fork 目标(将项目的主代码打包成 jar 文件)绑定到 verify 这个 phase

 

12.   很多插件的目标在编写时已经定义了默认绑定阶段。可以用以下命令查看:

Mvn help:describe –Dplugin=org.apache.maven.plugins:maven-source-plugin:2.1.1 –Ddetail

 

13.   如果多个目标被绑定到同一个阶段,它们的执行顺序由插件声明的先后顺序决定。

默认绑定与自定义绑定的执行顺序是?

 

14.   可以在命令行执行 maven 命令时提供 plugin 的参数配置:

Mvn install –Dmaven.test.skip=true

maven.test.skip maven-surefire-plugin 的一个参数,当其值为 true 时,就会跳过执行测试。

 

15.   可以在 POM 的插件配置中对插件进行一个全局的参数配置:

 

<build>

  <plugins>

    <plugin>

      <groupId>org.apache.maven.plugins</groupId>

      <artifactId>maven-compiler-plugin</artifactId>

      <version>2.1</version>

      <configuration>

          <source>1.5</source>

          <target>1.5</target>

       </configuration>

      </plugin>

</plugins>

</build> 
 

该配置告诉 maven-compiler-plugin 要编译的源文件是 Java 1.5 的,并且生成与 JVM 1.5 兼容的字节代码文件。由于 maven-compiler-plugin 被绑定到 compile test-compile 阶段,所以上述配置对这两个阶段都会生效。

 

16.   我们还可以为某个插件目标及其绑定的某个阶段配置特定的参数:

 

<plugin>

  <groupId>org.apache.maven.plugins</groupId>

  <artifactId>maven-antrun-plugin</artifactId>

  <version>1.3</version>

  <executions>

    <execution>

      <id>ant-validate</id>

      <phase>validate</phase>

      <goals>

        <goal>run</goal>

      </goals>

      <configuration>

        <tasks>

          <echo>I’m bound to validate phase.</echo>

        </tasks>

      </configuration>

     </execution>

    <execution>

      <id>ant-verify</id>

      <phase>verify</phase>

      <goals>

        <goal>run</goal>

      </goals>

      <configuration>

        <tasks>

          <echo>I’m bound to verify phase.</echo>

        </tasks>

      </configuration>

    </execution>

  </executions>

</plugin> 
 

以上配置将 maven-antrun-plugin:run 绑定到了 validate verify 两个 phase ,但为两个 phase 设置了不同的参数。

 

17.   基本上所有的插件都来自于 Apache Codehaus

插件来源

插件列表

下载地址

Apache

http://maven.apache.org/plugins/index.html

http://repo1.maven.org/maven2/org/apache/maven/plugins

Codehaus

http://mojo.codehaus.org/plugins.html

http://repository.codehaus.org/org/code-haus/mojo/

 

 

 

 

 

 

 

 

18.   可以从插件目标的文档中查阅参数的 Expression 属性,它表示了该参数在命令行中的参数名,如果没有 Expression 则说明该插件目标参数只能在 POM 中配置。如:

Maven-surefire-plugin skip 参数, Expression :${maven.test.skip} 则在命令行中配置该参数时参数名就为 -Dmaven.test.skip 。而在 POM 中配置时,参数名为 skip

 

19.   我们既可以通过 mvn 命令激活某个生命周期阶段,也可以直接调用某个插件目标,因为有些任务不适合绑定到生命周期阶段上,如: maven-help-plugin:describe maven-dependency-plugin:tree 为了简化插件目标的定位, Maven 引入了插件前缀( Plugin Prefix ),可以用插件前缀替换插件坐标,方便在命令行直接运行插件。如:

Mvn help:describe –Dplugin=compiler –Dgoal=compile -Ddetail

 

20.   Maven 会区别对待依赖的远程仓库和插件的远程仓库。可以在 POM 中配置插件的远程仓库。 Maven 内置的插件仓库配置:

 

<pluginRepositories>

  <pluginRepository>

    <id>central</id>

    <name>Maven Plugin Repository</name>

    <url>http://repo1.maven.org/maven2</url>

    <layout>default</layout>

    <snapshots>

      <enabled>false</enabled>

    </snapshosts>

    <releases>

      <updatePolicy>never</updatePolicy
>

    </releases>

  </pluginRepository>

</pluginRepositories>
 

一般来说,中央仓库所包含的插件完全能够满足我们的需要。

 

21.   配置插件时可以不配置其 groupId Maven 会默认用 org.apache.maven.plugins

 

22.   Maven 在超级 POM 中为所有核心插件定义了版本。如果用户使用某个插件而没定义版本时,会使用超级 POM 中定义的版本,如果这个插件不属于核心插件, Maven 2 会解析成 lastest Maven 3 会解析成 release

 

23.   插件前缀会保存在 groupId/maven-metadata.xml 中。 Maven 在解析插件仓库元数据时,会默认使用 org.apahce.maven.plugins org.codehaus.mojo 两个 groupId ,用户可以配置 settings.xml Maven 检查其他 groupId 上的插件仓库元数据:

 

<settings>

  <pluginGroups>

    <pluginGroup>com.your.plugins</pluginGroup>

  </pluginGroups>

</settings> 
 

元数据信息如下:

 

<metadata>

  <plugins>

    <plugin>

      <name>Maven Clean Plugin</name>

      <prefix>clean</prefix>

       <artifactId>maven-clean-plugin</artifactId>

    </plugin>

    …

  </plugins>

</metadata> 
分享到:
评论

相关推荐

    Maven实战(高清版)

    背景案例第5章 坐标和依赖第6章 仓库第7章 生命周期和插件第8章 聚合与继承第9章 使用nexus创建私服第10章 使用maven进行测试第11章 使用hudson进行持续集成第12章 使用maven构建web应用第13章 版本管理第...

    maven window下安装包

    第7章:生命周期和插件/7.4 插件绑定/7.4.2 自定义生命周期和插件的绑定 第7章:生命周期和插件/7.5 插件配置/7.5.1 命令行插件参数设置 第7章:生命周期和插件/7.5 插件配置/7.5.2 POM文件中进行插件参数设置 第7章...

    Eclipse插件开发学习笔记-源代码1至24章.zip

    在Eclipse插件开发中,首先需要理解的是OSGi(Open Services Gateway Initiative)框架,它是Eclipse的基础架构,用于管理插件之间的依赖关系和生命周期。每个Eclipse插件都是一个独立的OSGi模块,可以导入和导出...

    软件生命周期.docx

    总结来说,软件生命周期是一个系统化的过程,旨在通过有序的阶段管理和文档化工作,确保软件产品的质量和用户满意度。虽然具体的实践可能会因项目和技术的变化而有所不同,但生命周期的基本原理仍然是软件开发过程的...

    eclipse插件开发学习笔记9-24章

    本章会涵盖创建自定义视图的步骤,包括视图生命周期管理、数据模型和UI更新策略。 4. **第13章:编辑器(Editors)** - 编辑器是Eclipse中的核心组件,用于编辑文件或资源。本章将深入讨论如何开发自定义编辑器,...

    eclipse rcp 插件开发学习笔记.pdf 1-14章

    - 创建自定义编辑器,了解IEditorPart接口和编辑器的生命周期。 - 实现编辑器的数据模型,以及与模型的交互。 11. **第14章 透视图(Perspectives)**: - 理解透视图的概念,它是Workbench中的工作环境配置。 ...

    eclipse插件开发学习笔记1-14章

    第二至第四章可能会讲解Eclipse插件的生命周期管理,包括启动序列、扩展点(extension points)和扩展(extensions)。扩展点是Eclipse提供的接口,允许插件插入自己的功能;扩展则是插件对这些接口的具体实现。此外...

    Eclipse插件开发学习笔记6-11章

    第9章 "Eclipse插件体系结构"探讨了Eclipse插件开发的核心概念,包括插件生命周期、依赖管理、扩展点和扩展。理解Eclipse的插件体系结构有助于开发者更好地组织代码,使其插件能与其他插件协同工作,同时掌握如何...

    eclipse插件开发学习笔记(扫描版1-14章)

    第九章"Eclipse插件体系结构"深入剖析了Eclipse插件的工作原理,包括插件的生命周期、依赖关系、扩展点(Extension Points)和贡献项(Extensions)等概念,这是理解Eclipse插件开发机制的核心。 第十章"开发第一个...

    我的java 插件1 插件7

    - **features**:在某些插件框架中,比如Eclipse,"features"是一种高级的打包和部署单位,它是一组相关的插件和配置的集合。一个feature可以包含多个插件,以及它们之间的依赖关系,使得安装和管理变得更加简单。 ...

    Eclipse插件开发(第3版 - 高清).pdf.zip

    书中详细讲解了Eclipse插件的生命周期、插件结构、插件依赖关系以及如何使用Eclipse的Plug-in Development Environment (PDE)工具进行开发。 2. **Java**: Java作为Eclipse插件开发的基础语言,开发者需要掌握...

    C# 插件结构设计 C# 插件结构设计

    例如,一个`IPlugin`接口可能包含`Initialize`和`Execute`方法,用于初始化插件和执行其功能。 4. **插件发现机制** 主程序需要有一种方式来发现和加载可用的插件。这通常通过扫描特定的目录或者使用配置文件来...

    K3 WISE BOS插件开发培训(2018版)

    3. **插件生命周期**:从创建到部署,插件经历了设计、编码、测试和发布等阶段。开发者需要掌握如何在BOS平台上创建新插件项目,编写代码实现功能,以及进行单元测试和系统测试。 4. **插件设计原则**:遵循良好的...

    插件与主程序

    插件的生命周期管理和错误处理也是主程序的重要职责。一旦插件加载成功,主程序可以根据需要激活或禁用它们,确保系统的正常运行。 6. **安全性与稳定性**: 由于插件可能来自不同的来源,主程序需要对它们进行...

    Dreamweaver编写ASP.NET插件

    2. **ASP.NET语法理解**:在开发插件前,开发者需熟悉ASP.NET的语法和架构,包括控件、数据绑定、页面生命周期、MVC模式等。这将帮助创建能够正确处理ASP.NET代码的插件。 3. **插件开发环境**:通常,开发者会使用...

    知识分享idea插件工程

    7. **插件生命周期管理**:了解`initComponent`和`disposeComponent`方法,它们分别在插件启动和关闭时调用,用于初始化和释放资源。 8. **版本控制与持续集成**:推荐使用Git进行版本控制,并结合Jenkins、Travis ...

    构建插件式的应用程序框架(七)-基本服务

    8. **性能优化**:为了保证整体性能,框架需要有效地管理插件的生命周期,如延迟加载、按需加载和缓存策略。此外,优化插件间的通信方式(如使用本地消息队列)也是必要的。 9. **测试与调试**:良好的插件框架应...

    C#插件框架addin_framework

    C#插件框架通常采用依赖注入(Dependency Injection,DI)来管理插件的生命周期和依赖关系。这使得主程序能够控制插件的实例化,同时也方便了对插件的服务共享。 4. **服务层(Addin.Services)**: "Addin....

    Eclipse插件开发文档

    每个插件都有自己的生命周期、依赖关系,并通过API与其他插件通信。核心插件提供基础功能,如编辑器、运行时环境等,而第三方插件则可以扩展这些功能,如支持其他编程语言、版本控制工具等。 二、开发环境搭建 要...

    插件程序设计

    插件的生命周期包括加载、初始化、运行和卸载。主程序需要能够正确地管理这些阶段,确保插件的安全启动和关闭,防止资源泄漏或状态冲突。 7. **安全性与隔离**: 由于插件可能来自第三方开发者,安全性是个重要...

Global site tag (gtag.js) - Google Analytics