`

深入理解maven与应用

 
阅读更多

1、三套生命周期


     对于maven的生命周期来说,共有三个相互独立的生命周期,分别是clean、default、site。clean生命周期目的是清理项目,default生命周期目的是构建项目,而site生命周期目的是建立项目站点。
     每个生命周期分别包含一些阶段,这些阶段是有顺序的,并且后面的阶段依赖于前面的阶段。如clean生命周期包含pre-clean、clean和post-clean三个阶段,如果执行clean阶段,则会先执行pre-clean阶段。
     较之于生命周期阶段有前后依赖关系,三套生命周期本身是相互独立的,用户可以仅调用clean生命周期的某个阶段,也可以不执行clean周期,而直接执行default生命周期的某几个阶段。


2、clean生命周期


     clean生命周期包含三个阶段,主要负责清理项目,如下:

 

pre-clean executes processes needed prior to the actual project cleaning
clean remove all files generated by the previous build
post-clean executes processes needed to finalize the project cleaning

 


3、default生命周期


    default生命周期定义了真正构建时所需要执行的所有步骤,包含的阶段如下:

 

validate validate the project is correct and all necessary information is available.
initialize initialize build state, e.g. set properties or create directories.
generate-sources generate any source code for inclusion in compilation.
process-sources process the source code, for example to filter any values.
generate-resources generate resources for inclusion in the package.
process-resources copy and process the resources into the destination directory, ready for packaging.
compile compile the source code of the project.
process-classes post-process the generated files from compilation, for example to do bytecode enhancement on Java classes.
generate-test-sources generate any test source code for inclusion in compilation.
process-test-sources process the test source code, for example to filter any values.
generate-test-resources create resources for testing.
process-test-resources copy and process the resources into the test destination directory.
test-compile compile the test source code into the test destination directory
process-test-classes post-process the generated files from test compilation, for example to do bytecode enhancement on Java classes. For Maven 2.0.5 and above.
test run tests using a suitable unit testing framework. These tests should not require the code be packaged or deployed.
prepare-package perform any operations necessary to prepare a package before the actual packaging. This often results in an unpacked, processed version of the package. (Maven 2.1 and above)
package take the compiled code and package it in its distributable format, such as a JAR.
pre-integration-test perform actions required before integration tests are executed. This may involve things such as setting up the required environment.
integration-test process and deploy the package if necessary into an environment where integration tests can be run.
post-integration-test perform actions required after integration tests have been executed. This may including cleaning up the environment.
verify run any checks to verify the package is valid and meets quality criteria.
install install the package into the local repository, for use as a dependency in other projects locally.
deploy done in an integration or release environment, copies the final package to the remote repository for sharing with other developers and projects.

 

 

4、site生命周期


     siet生命周期的目的是建立和发布项目站点,maven能够基于POM所包含的信息,自动生成一个友好的站点,方便团队交流和发布项目信息,包含的阶段如下:

    

pre-site executes processes needed prior to the actual project site generation
site generates the project's site documentation
post-site executes processes needed to finalize the site generation, and to prepare for site deployment
site-deploy deploys the generated site documentation to the specified web server

 

5、命令行与生命周期

     从命令行执行maven任务的最主要方式就是调用maven的生命周期阶段。需要注意的是,各个生命周期是相互独立的,而一个生命周期的阶段是有前后依赖关系的。例子如下:
     1、$mvn clean :该命令调用clean生命周期的clean阶段。实际执行的阶段为clean生命周期的pre-clean和clean阶段。
     2、$mvn test:该命令调用default生命周期的test阶段。实际调用的是default生命周期的validate、initialize等,直到test的所有阶段。
     3、$mvn clean install:该命令调换用clean生命周期的clean阶段和default生命周期的instal阶段。

6、插件目标

      maven的核心仅仅定义了抽象的生命周期,具体的任务是交由插件完成的,插件以独立的形式存在。
     对于插件本身,为了能够复用代码,它往往能够完成多个任务。如maven-dependency-plugin有十多个目标,每个目标对应了一个功能,如 dependency:analyze、 dependency:tree和dependency:list。这是一种通用的写法,冒号前面是插件前缀,后面是该插件的目标。

7、插件绑定

 maven的生命周期与插件相互绑定,用以完成实际的构建任务。具体而言,是生命周期的阶段与插件的目标相互绑定,已完成某个具体的构建任务。例如项目编译这一任务,它对应了default生命周期的compile阶段,而maven-compiler-plugin这一插件的compile目标能够完成该任务,因此将他们绑定。

7.1内置绑定

 maven在核心为一些主要的生命周期接到绑定了很多插件的目标,如下:
     clean和site生命周期相对简单。

 

clean clean:clean

 

 

site site:site
site-deploy site:deploy

 


     default生命周期与插件目标的绑定关系有点复杂一些。这是因为对于任何项目来说,例如jar项目和war项目,他们的项目清理和站点生成任务是一样的,不过构建过程会有区别。例如jar项目需要打成jar包,而war项目需要打成war包。
     由于项目的打包类型会影响构建的具体过程,因此,default生命周期的阶段与插件目标的绑定关系有项目打包类型所决定的,打包类型是通过pom中的packaging元素定义的。最常见的打包类型是jar,它也是默认的打包类型。基于该打包类型,default生命周期的内置绑定关系如下:

 

process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install install:install
deploy deploy:deploy

 

 

7、2自定义绑定

     除了内置绑定以为,用户还能够自己选择奖某个插件目标绑定到生命周期的某个阶段以执行更多更特色的任务。

  1. <!-- 自动复制资源文件件到根目录 -->  
  2.             <plugin>  
  3.                 <groupId>org.apache.maven.plugins</groupId>  
  4.                 <artifactId>maven-resources-plugin</artifactId>  
  5.                 <version>2.6</version>  
  6.                 <configuration>  
  7.                     <includeEmptyDirs>true</includeEmptyDirs>  
  8.                     <encoding>GBK</encoding>  
  9.                     <nonFilteredFileExtensions>  
  10.                         <nonFilteredFileExtension>exe</nonFilteredFileExtension>  
  11.                         <nonFilteredFileExtension>zip</nonFilteredFileExtension>  
  12.                         <nonFilteredFileExtension>vbs</nonFilteredFileExtension>  
  13.                         <nonFilteredFileExtension>sh</nonFilteredFileExtension>  
  14.                     </nonFilteredFileExtensions>  
  15.                 </configuration>  
  16.                 <executions>  
  17.                     <execution>  
  18.                         <id>copy-resources</id>  
  19.                         <phase>validate</phase>  
  20.                         <goals>  
  21.                             <goal>copy-resources</goal>  
  22.                         </goals>  
  23.                         <configuration>  
  24.                             <includeEmptyDirs>true</includeEmptyDirs>  
  25.                             <outputDirectory>${project.build.directory}</outputDirectory>  
  26.                             <excludes>  
  27.                                 <exclude>agentmanager.jsmooth</exclude>  
  28.                                 <exclude>assembly.xml</exclude>  
  29.                             </excludes>  
  30.                             <resources>  
  31.                                 <resource>  
  32.                                     <directory>src/main/resources/</directory>  
  33.                                     <filtering>true</filtering>  
  34.                                 </resource>  
  35.                             </resources>  
  36.                         </configuration>  
  37.                     </execution>  
  38.                 </executions>  
  39.             </plugin>  


     如上图定义了一个id为copy-resources的任务,绑定到default生命周期的validate阶段,绑定的插件为maven-resources-plugin,插件目标为copy-resources。即用插件的copy-resources功能来实现项目资源文件的拷贝。

  1. <!-- 自动复制maven依赖包到lib目录 -->  
  2.             <plugin>  
  3.                 <groupId>org.apache.maven.plugins</groupId>  
  4.                 <artifactId>maven-dependency-plugin</artifactId>  
  5.                 <version>2.1</version>  
  6.                 <executions>  
  7.                     <execution>  
  8.                         <id>copy</id>  
  9.                         <phase>install</phase>  
  10.                         <goals>  
  11.                             <goal>copy-dependencies</goal>  
  12.                         </goals>  
  13.                         <configuration>  
  14.                             <outputDirectory>lib</outputDirectory>  
  15.                         </configuration>  
  16.                     </execution>  
  17.                 </executions>  
  18.             </plugin>  


同上,定义了一个id为copy的任务,利用插件maven-dependency-plugin的copy-dependencies目标绑定到default生命周期的install阶段,来实现项目依赖的jar包的自动复制。

     当插件目标被绑定到不同的生命周期阶段时候,其执行顺序会有生命周期阶段的先后顺序决定的。如果多个目标被绑定到同一个阶段,他们的执行顺序是由插件声明的先后顺序决定目标的执行顺序

8、插件配置


 用户可以配置插件目标的参数,进一步调整插件目标所执行的任务。

8、1命令行插件配置

 如 $mvn install -Dmaven.test.skip=true 的意义即跳过测试步骤。
      参数-D的java自带的,其功能是通过命令行设置一个java系统属性,maven简单地重用了该参数以实现插件参数的配置。

8、2pom中插件全局配置

如项目编译使用1.6版本的源文件,生成与JVM1.6兼容的字节码文件,如下:

  1. <plugin>  
  2.                 <groupId>org.apache.maven.plugins</groupId>  
  3.                 <artifactId>maven-compiler-plugin</artifactId>  
  4.                 <version>2.3.2</version>  
  5.                 <configuration>  
  6.                     <source>1.6</source>  
  7.                     <target>1.6</target>  
  8.                 </configuration>  
  9.             </plugin>  


 

9、获取插件描述信息

 

    $mvn help:describe-Dplugin=org.apache.maven.plugins:maven-compiler-plugin:2.1  来获取插件的详细信息
    可以简化为:
    $mvn help:describe-Dplugin=compiler
    如果仅仅描述插件目标的信息,可以加上goal参数:
    $mvn help:describe-Dplugin=compiler-Dgoal=compile
    如果想输出更详细的信息,可以加上detail参数:
    $mvn help:describe-Dplugin=compiler-Ddetail

 

 

 一个优秀的构建系统必须足够灵活,应该能够让项目在不同的环境下都能成功构建。maven为了支持构建的灵活性,内置了三大特性,即:属性、profile和资源过滤

1、maven属性

 maven属性分6类:
    1、内置属性:如${basedir}表示项目根目录,${version}表示项目版本
    2、POM属性:用户可以引用pom文件中对应的值。如:
         ${basedir} 项目根目录
         ${project.build.directory} 构建目录,缺省为target
         ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
         ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
         ${project.packaging} 打包类型,缺省为jar
         ${project.xxx} 当前pom文件的任意节点的内容 
    3、自定义属性:用户可以在pom的<properties>元素下自定义maven属性。
    4、setting属性:用户可以使用以settings开头的属性引用settings.xml中xml元素的值,如${settings.localRepository}指向用户本地仓库的地址。
    5、java系统属性:maven可以使用当前java系统的属性,如${user.home}指向了用户目录。
    6、环境变量属性:所有环境变量都可以使用以env.开头的属性。如:${env.JAVA_HOE}。

2、资源过滤

     这里所谓的资源:也就就是指src/main/resources和src/test/resources文件下的所有文件,默认情况下,这些文件会被复制到classpath下面,即target/classes下面。
     所谓资源过滤,就是过滤这些文件夹下面的文件里面的内容,看里面的maven变量是否需要替换。默认情况下,只有pom.xml里面的变量才会被替换,资源文件是不会被过滤的,但是可以设置,如下:

  1. <build>  
  2.         <finalName>agentmanager</finalName>  
  3.         <sourceDirectory>src/main/java</sourceDirectory>  
  4.         <resources>  
  5.             <!-- 控制资源文件的拷贝 -->  
  6.             <resource>  
  7.                 <directory>src/main/resources</directory>  
  8.                 <excludes>  
  9.                     <exclude>**/jre.zip</exclude>  
  10.                     <exclude>**/jre.tar</exclude>  
  11.                     <exclude>agentmanager.jsmooth</exclude>  
  12.                     <exclude>assembly.xml</exclude>  
  13.                 </excludes>  
  14.                 <targetPath>${project.build.directory}</targetPath>  
  15.             </resource>  
  16.             <resource>  
  17.                 <directory>src/main/resources/conf</directory>  
  18.                 <targetPath>${basedir}/conf</targetPath>  
  19.                 <filtering>true</filtering>  
  20.             </resource>  
  21.         </resources>  
  22.     </build>  


 

如jdbc.properties

  1. jdbc.driverClassName=${db.driver}  
  2. jdbc.url=${db.url}  
  3. jdbc.username=${db.user}  
  4. jdbc.password=${db.pwd}  

 

profile文件

  1. <profiles>  
  2.  <profile>  
  3.   <id>dev</id>  
  4.   <properties>  
  5.    <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>  
  6.    <db.url>jdbc:oracle:thin:@10.252.48.3:1521:dbname</db.url>  
  7.    <db.user>username</db.user>  
  8.    <db.pwd>userpwd</db.pwd>  
  9.   </properties>  
  10.  </profile>  
  11.  <profile>  
  12.   <id>test</id>  
  13.   <properties>  
  14.    <db.driver>oracle.jdbc.driver.OracleDriver</db.driver>  
  15.    <db.url>jdbc:oracle:thin:@10.252.48.3:1521:testdbname</db.url>  
  16.    <db.user>testusername</db.user>  
  17.    <db.pwd>testuserpwd</db.pwd>  
  18.   </properties>  
  19.  </profile>  
  20. </profiles>  



在构建时可以使用-P参数激活一个或多个profile,多个之间用逗号分隔
如 mvn clean install -Pdev

3、maven profile

     上面例子应该可以看出profile是做什么的,其实就相当于定义了一系列的profile变量,在具体构建时可用使用其中的某个profile去变量替换资源文件。
      激活profile的方式有很多,如命令行激活(上面),settings文件显式激活、系统属性激活、操作系统环境激活、默认激活、文件存在与否激活等,具体可以参考官网资料


3.1 profile的种类

     根据需要,可以在以下文件声明profile。
      1、pom.xml 针对当前项目
      2、用户 settings.xml 用户目录下的.m2/settings.xml, 对当前用户的所有项目有效。
      3、全局 settings.xml 即maven安装目录下的conf/settings.xml。对本机上的所有项目有效。

4、web资源过滤

     在maven的web项目里面,除了上面所说的资源文件(src/main/resources)之外,还有一类叫做web资源目录,即src/main/webapp下面的js、css等等。默认情况下,这些目录是不被资源过滤的,开启的命令如下:

  1.   <plugin>  
  2.     <groupId>org.apache.maven.plugins</groupId>  
  3.     <artifactId>maven-war-plugin</artifactId>  
  4.     <version>2.1.1</version>  
  5.     <configuration>  
  6.         <webResources>  
  7.         <resource>  
  8.             <directory>src/main/webapp</directory>  
  9.             <filtering>true</filtering>  
  10.             <includes>  
  11.             <include>**/*.css</include>  
  12.             <include>**/*.js</include>  
  13.             </includes>                            
  14.         </resource>      
  15.         </webResources>  
  16.     </configuration>  
  17. </plugin>  

 

from:http://blog.csdn.net/chaofanwei/article/details/36197183

分享到:
评论

相关推荐

    Maven应用实战源码 配套源码

    《Maven应用实战》这本书由杨式文和孙会军编著,提供了丰富的实践案例和详尽的解析,帮助读者深入理解并掌握Maven的使用技巧。本篇将基于该书的配套源码,探讨Maven的核心概念和关键功能。 首先,我们需要了解Maven...

    maven实例应用(基于ssm框架)

    【SSM框架与Maven的关系】 SSM框架是Spring、Spring ...通过深入研究这个实例,开发者可以提升项目构建能力,理解Spring、Spring MVC和MyBatis的协同工作原理,从而在实际工作中更高效地开发和维护Java Web应用程序。

    Maven3应用入门session

    通过阅读这个PPT,你可以深入理解Maven3的工作原理,并学会如何在实际开发中有效利用它。 总之,掌握Maven3是Java开发者的必备技能之一,它可以帮助我们规范项目结构,简化依赖管理,提高开发效率,使得构建和部署...

    深入解析 Maven 核心概念与高级特性

    使用场景及目标:适用于需要理解和掌握 Maven 的核心概念及其高级特性的开发团队成员,帮助他们在实际项目中有效地使用 Maven 进行构建和依赖管理。 阅读建议:建议读者结合实际项目案例进行实践操作,逐步掌握 ...

    maven教程-maven教程-maven教程

    Maven的快速入门包括配置环境变量、了解Maven的仓库概念以及基本的构建命令。Maven的仓库分为本地仓库和远程仓库,本地仓库用于存储本地项目依赖的jar包,远程仓库则是Maven中央仓库或其他第三方仓库,用于当本地...

    eclipse搭建maven项目应用以及ajax的应用

    在这里,我们将深入探讨如何利用Eclipse创建一个Maven项目,并集成这些技术和Ajax。 首先,我们来了解如何在Eclipse中设置Maven项目。启动Eclipse,选择"File" -&gt; "New" -&gt; "Project",然后在"Maven"类别下选择...

    maven API maven API

    **Maven API 深入理解** Maven API 是 Apache Maven 的核心接口和类库,它是构建Java项目的重要工具,提供了强大的依赖管理和项目对象模型(Project Object Model, POM)。Maven API使得开发者能够通过简单的命令行...

    maven继承与聚合代码

    在提供的资源《一头扎进Maven3》第五讲源码及文档中,你可以找到实际的项目结构和POM配置示例,这将有助于你更深入理解Maven继承和聚合的工作原理。通过阅读和实践这些示例,你将能更好地掌握如何在实际项目中应用这...

    maven与maven教程

    通过阅读这本书,你可以深入理解Maven的工作原理,并学习如何在实际项目中有效利用Maven提高开发效率。 总的来说,Maven提供了一种标准化的方式来管理Java项目,通过其强大的依赖管理和自动化构建能力,极大地简化...

    Maven exec-maven-plugin:执行外部命令的实践指南

    通过本文的介绍,读者应该对如何使用exec-maven-plugin有了深入的理解,能够将其应用到实际的Maven项目中。 本文详细介绍了exec-maven-plugin的基本概念、配置方法、执行简单和系统脚本、捕获命令输出、条件执行、...

    Apache Maven项目构建工具 v3.9.6.zip

    通过分析`maven-maven-3.9.6`中的源码,开发者可以理解Maven的工作原理,这对于深入学习Maven以及进行相关工具开发非常有益。对于毕业设计或论文,Maven是一个很好的实践案例,可以探讨项目管理工具如何提升开发效率...

    Maven打包实战.zip

    本压缩包文件“Maven打包实战.zip”提供了关于Maven打包的实战教程,配合文章《Maven打包实战》(链接已提供)学习,将有助于深入理解Maven的打包流程。 首先,我们需要理解Maven的生命周期。Maven生命周期包括三个...

    Maven实践-使用Maven开发Web应用

    本文将深入探讨如何利用Maven进行Web应用的开发实践。 首先,理解Maven的核心概念是至关重要的。Maven基于项目对象模型(Project Object Model, POM),它是一个XML文件,包含了项目的配置信息,如依赖、构建目标和...

    maven3.6.2版本

    对于初学者,了解Maven的命令行界面(CLI)是至关重要的。常见的命令有`mvn clean`用于清理构建输出,`mvn compile`用于编译源代码,`mvn test`运行测试,`mvn package`打包应用,以及`mvn install`将项目安装到本地...

    构建基于Maven的SSH原型项目

    在IT行业中,SSH(Struts2、Spring、...学习这个主题,不仅可以提升Java Web开发技能,还能深入理解Maven的项目管理机制,以及SSH框架如何协同工作,对于任何想要进入Java企业级开发领域的开发者来说都是宝贵的资源。

    手把手构建Maven企业级应用(整合SSI框架).pdf

    通过以上步骤,我们不仅能够构建出一个结构清晰、易于维护的企业级应用,还能够在实际开发过程中深入理解Maven和SSI框架的工作原理,提高开发效率和代码质量。希望本教程能够帮助初学者快速掌握这一领域的知识和技术...

    MAVEN包和插件

    在这个压缩包中,包含了几个与Maven相关的PDF文件,这些文件将帮助我们深入理解Maven的使用及其在实际开发中的应用。 首先,"springdatajpa实战.pdf"可能是关于Spring Data JPA的实战指南。Spring Data JPA是Spring...

    maven项目转换WEB项目

    首先,让我们了解Maven项目的基本结构。一个标准的Maven项目通常包含以下几个关键目录: 1. `src/main/java`:这是存放源代码的地方,按照包的结构进行组织。 2. `src/main/resources`:用于放置非编译的资源文件,...

    Maven笔记与资料.zip

    学习这些资料有助于提升你在实际项目中的Maven应用能力,解决遇到的问题,并优化构建流程。 综上所述,Maven是一个强大的项目管理和构建工具,通过POM和生命周期,为Java开发提供了标准化的流程。熟练掌握Maven能...

    maven中文文档和maven免安装版

    首先,让我们深入了解Maven的核心概念。Maven基于项目对象模型(Project Object Model,POM),这是一个XML文件,包含了项目的配置信息,如项目依赖、构建目标、构建过程等。POM文件是Maven工作的基础,通过解析POM...

Global site tag (gtag.js) - Google Analytics