maven3总结

来源:互联网 发布:淘宝哑铃品牌排行榜 编辑:程序博客网 时间:2024/05/22 03:48

preface

        早在2010年就听说了maven这个强大的工具,只是一直未能有机会在工作中尝试,让我苦恼了很旧,最近经理决定升级项目框架,才用maven来作为项目管理工具,让我好是开心了一番.


what is  Maven ?

     绝大部分Maven用户都称Maven是一个"构建工具":一个用来把源代码构建成可发布的构件的工具。 构建工程师和项目经理会说Maven是一个更复杂的东西:一个项目管理工具。那么区别是什么? 像Ant这样的构建工具仅仅是关注预处理,编译,打包,测试和分发。像 Maven 这样的一个项目管理工具提供了构建工具所提供功能的超集。 除了提供构建的功能,Maven还可以生成报告,生成Web站点,并且帮助推动工作团队成员间的交流。一个更正式的 Apache Maven 的定义: Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(ProjectLifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。 当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后 Maven 可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。 


what are the differences between maven and ant?

     Ant在构建过程方面十分优秀,它是一个基于任务和依赖的构建系统。每个任务包含一组由 XML 编码的指令。有 copy 任务和 javac 任务,以及 jar 任务。在你使用 Ant的时候,你为 Ant 提供特定的指令以编译和打包你的输出。你必须明确告诉 Ant 你的源码在哪里,结果字节码你想存储在哪里,如何将这些字节码打包成 JAR 文件。当然,Maven还有更强大的功能,简言之,Maven是一个项目管理工具,ant是一个项目构建工具。 
下面就项目构建方面对Maven和ant做下简单对比。 

Apache Ant 

  • Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码,哪里放置输出。随着时间的推移,非正式的约定出现了,但是它们还没有在产品中模式化。 
  • Ant 是程序化的,你必须明确的告诉 Ant 做什么,什么时候做。你必须告诉它去编译,然后复制,然后压缩。 
  • Ant 没有生命周期,你必须定义目标和目标之间的依赖。你必须手工为每个目标附上一个任务序列。 
Apache Maven 
  • Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里。它把字节码放到 target/classes ,然后在 target 生成一个 JAR 文件。 
  • Maven 是声明式的。你需要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其它的事情。 
  •  Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。 


what advantages maven have ?

  1. 工具可移植性/集成 
  2. 标准的项目布局和项目结构生成器 
  3. 多项目支持 
  4. 丰富的插件支持 
  5. maven中央仓库


install maven

        安装Maven的步骤非常简单:首先从Maven官方网站http://maven.apache.org/下载相应的软件包,目前是Maven 3.1.1;然后解压,并设置环境变量M2_HOME= Maven的解压安装目录;最后将%M2_HOME%/bin添加到path中,方便Maven在任何目录下运行。检查一下是否已经完成安装,打开dos窗口,输入mvn –v,如果出现一下信息则表示maven3已经安装成功:

X:>mvn –v

Apache Maven 3.1.1


Common commands

mvn -version/-v  显示版本信息


mvn help:describe -Dplugin=help 使用 help 插件的  describe 目标来输出 Maven Help 插件的信息。 

mvn help:describe -Dplugin=help -Dfull 使用Help 插件输出完整的带有参数的目标列 

mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull 获取单个目标的信息,设置  mojo 参数和  plugin 参数。此命令列出了Compiler 插件的compile 目标的所有信息 

mvn help:describe -Dplugin=exec -Dfull 列出所有 Maven Exec 插件可用的目标 

mvn help:effective-pom 看这个“有效的 (effective)”POM,它暴露了 Maven的默认设置  


mvn dependency:resolve 打印出已解决依赖的列表 

mvn dependency:tree 打印整个依赖树  


mvn install -X 想要查看完整的依赖踪迹,包含那些因为冲突或者其它原因而被拒绝引入的构件,打开 Maven 的调试标记运行 

mvn install -Dmaven.test.skip=true 给任何目标添加maven.test.skip 属性就能跳过测试 

mvn install assembly:assembly 构建装配Maven Assembly 插件是一个用来创建你应用程序特有分发包的插件  


mvn -e            显示详细错误 信息.

mvn validate        验证工程是否正确,所有需要的资源是否可用。 

mvn test-compile    编译项目测试代码。 。 

mvn integration-test     在集成测试可以运行的环境中处理和发布包。 

mvn verify        运行任何检查,验证包是否有效且达到质量标准。     

mvn generate-sources    产生应用需要的任何额外的源代码,如xdoclet。


mvn archetype:generate        创建mvn项目

mvn package            生成target目录,编译、测试代码,生成测试报告,生成jar/war文件

mvn jetty:run            运行项目于jetty上,

mvn compile                    编译

mvn test                    编译并测试

mvn clean                    清空生成的文件

mvn site                    生成项目相关信息的网站

mvn -Dwtpversion=1.0 eclipse:eclipse        生成Wtp插件的Web项目

mvn -Dwtpversion=1.0 eclipse:clean        清除Eclipse项目的配置信息(Web项目)

mvn eclipse:eclipse                将项目转化为Eclipse项目


在应用程序用使用多个存储库

<repositories>    

    <repository>      

        <id>Ibiblio</id>      

        <name>Ibiblio</name>      

        <url>http://www.ibiblio.org/maven/</url>    

    </repository>    

    <repository>      

        <id>PlanetMirror</id>      

        <name>Planet Mirror</name>      

        <url>http://public.planetmirror.com/pub/maven/</url>    

    </repository>  

</repositories>

发布第三方Jar到本地库中:

mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:/client-0.1.0.jar -DdownloadSources=true -DdownloadJavadocs=true


create project

生成项目布局:mvn archetype:generate -DgroupId=com.oreilly -DartifactId=my-app

创建完项目后,我们可以往项目里添加代码并使用Maven的所有全新技巧。注意以下命令必须在pom.xml文件所在的目录中运行。

–mvn test:运行应用程序中的单元测试

–mvn package:依据项目生成jar文件,以备依赖此项目时使用

–mvn install:将项目的jar文件添加到库中,

–mvn site:生成项目相关信息的网站

–mvn clean:清除目标目录中的生成结果

–mvn eclipse:eclipse:生成Eclipse项目文件

maven构建的生命周期

在Maven2中就引入了明确的生命周期概念,而且都提供与之对应的命令,使得项目构建更加清晰明了。主要的生命周期阶段:

validate,验证工程是否正确,所有需要的资源是否可用。
 compile,编译项目的源代码。
 test-compile,编译项目测试代码。
 test,使用已编译的测试代码,测试已编译的源代码。
 package,已发布的格式,如jar,将已编译的源代码打包。
 integration-test,在集成测试可以运行的环境中处理和发布包。
 verify,运行任何检查,验证包是否有效且达到质量标准。
 install,把包安装在本地的repository中,可以被其他工程作为依赖来使用
 deploy,在整合或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
 generate-sources,产生应用需要的任何额外的源代码,如xdoclet。

如果要执行项目编译,那么直接输入:mvn compile即可,对于其他的阶段可以类推。阶段之间是存在依赖关系(dependency)的,如test依赖test-compile。在执行mvn test时,会先运行mvn test-compile,然后才是mvn test。


maven plugins

1)maven-compiler-plugin 指定JDK版本

      <plugin>

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

             <version>2.3.2</version>

             <configuration>

              <source>1.6</source>

              <target>1.6</target>

              <showWarnings>true</showWarnings>

              <encoding>gbk</encoding>

             </configuration>

             <dependencies>

              <dependency>

                <groupId>org.codehaus.plexus</groupId>

                <artifactId>plexus-compiler-javac</artifactId>

                <version>1.8.1</version>

              </dependency>

             </dependencies>

       </plugin>

 

2)maven-war-plugin 打war包 在web子项目中指定

 

<build>          

    <finalName>launcher</finalName>

    <directory>target/jboss</directory>

     <plugins>

             <plugin>

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

                <artifactId>maven-war-plugin</artifactId>

                <version>2.1.1</version>

                <configuration>

                    <webResources>

                        <resource>

<directory>src/main/resources</directory>

                            <filtering>true</filtering>

                            <includes>

                                <include>**/*.xml</include>

                                <include>**/*.vm</include>

                            </includes>

                            <targetPath>WEB-INF</targetPath>

                        </resource>   

                    </webResources>

                </configuration>

            </plugin>

        </plugins>

</build>

 

3)单元测试插件

 

<plugin>

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

    <artifactId>maven-surefire-plugin</artifactId>

    <version>2.6</version>

    <configuration>

       <testFailureIgnore>true</testFailureIgnore>

 <!-单元测试失败依然打包-->

       <skip>true</skip> 是否过滤单元测试

       <!--<includes>

           <include>**/*Test.java</include>

       </includes>-->

       <excludes>

           <exclude>**/*Test.java</exclude>

         </excludes>

    </configuration>

</plugin>

 

4)jar包插件

 

<plugin>

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

    <artifactId>maven-jar-plugin</artifactId>

    <version>2.3.1</version>

    <configuration>

       <archive>

          <addMavenDescriptor>false</addMavenDescriptor>

是否增加maven描述信息

           <manifest>

<addDefaultImplementationEntries>

true

</addDefaultImplementationEntries>

           </manifest>

           <manifestEntries>

          <Implementation-Build>${buildNumber}</Implementation-Build>

           </manifestEntries>

       </archive>

    </configuration>

</plugin>

 

5)resource插件  类似antx的auto-config功能

Mvn package –Pdev  dev即定义的ID

Antx中的属性文件在Maven中如何引用?

在主pom.xml中增加配置属性 

<profiles>中可以有多个profile, id需唯一

 

<profiles>

       <profile>

           <id>dev</id>

           <properties>

           <props>launcher.properties.dev</props>

  <dependency.version.ext>-SNAPSHOT</dependency.version.ext>

           </properties>

           <activation>

              <activeByDefault>true</activeByDefault>

是否默认引用此文件 如果此项为true,引用此文件 参数-P可以不加

           </activation>

       </profile>

    </profiles>

 

根据外部属性文件填写需要过滤文件中的变量,默认会生成到classes目录

 

<filters>

           <filter>jdbc.properties.dev</filter>

Filter 配置项指定过滤那个文件?

1) 可以写文件名

2) 也可以写-P指定的profile ,

引用的是上述定义的profile dbc.properties.dev替换为../${props}

       </filters>

       <resources>

           <resource>

              <directory>src/main/resources</directory>

              <filtering>true</filtering>

true需要过滤,false不需要过滤

              <includes>  需要过滤的文件

                  <include>**/*.*</include>

                  <include>**/*</include>

              </includes>

              <excludes> 那些文件不需要移动到classes目录

              <exclude>**/*.xml</exclude>

              <exclude>**/*.vm</exclude>

              </excludes>

           </resource>

           <resource>

              <directory>src/main/java</directory>

              <includes>

                  <include>**/*.xml</include>

              </includes>

           </resource>

       </resources>

6)maven-eclipse-plugin插件

    <plugin>

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

                  <artifactId>maven-eclipse-plugin</artifactId>

                  <version>2.8</version>

                  <configuration>

                     <sourceExcludes>

                         <sourceExclude>**/.svn/</sourceExclude>

                     </sourceExcludes>

                     <downloadSources>true</downloadSources>

                  </configuration>

              </plugin>


原创粉丝点击