`
Josh_Persistence
  • 浏览: 1633295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类

Maven强大的插件在项目中的具体运用 - 不断更新中

阅读更多

Maven中强大的Plugin 机制

我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven- compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven- compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。

 

用户可以通过两种方式调用Maven插件目标。

1) 将插件目标与生命周期阶段(lifecycle phase)绑定.

     这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。

2) 直接在命令行指定要执行的插件目标:

例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

 

认识上述Maven插件的基本概念能帮助你理解Maven的工作机制,不过要想更高效率地使用Maven,了解一些常用的插件还是很有必要的,这可以帮助 你避免一不小心重新发明轮子。多年来Maven社区积累了大量的经验,并随之形成了一个成熟的插件生态圈。Maven官方有两个插件列表,第一个列表的 GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址为:http://maven.apache.org/plugins/index.html。第二个列表的GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org/plugins.html

 

言归正传:如下插件是项目中经常用到的:

 

1. maven-compliler-plugin 用于编译一个与当前你正在使用的JVM版本不同的project。

比如,如果你想打开JVM1.4的assertions(-source1.4)并且想编译与JVM1.4相兼容的类,可以用下面的plugin

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.4</source>
          <target>1.4</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

注:设置target这个选项不能够保证你的代码就一定能够在指定的版本上运行。可能会有一些没有在计划中的未知的API是在你所指定的JRE版本后的JRE中才提供的,这回导致你的code在运行时出现linkage的错误。为了避免这种错误,可以使用Animal Sniffer Maven Plugin(http://mojo.codehaus.org/animal-sniffer-maven-plugin/)来检查你的code是否使用了这些不在计划中的API,也可以配置编译器的根路径保证其和你目标的JRE路径一致。

 

2.maven-surefire-plugin 用于指定进行Unit test的Class(http://maven.apache.org/plugins/maven-surefire-plugin/

可能是由于历史的原因,Maven 2/3中用于执行测试的插件不是maven-test-plugin,而是maven-surefire-plugin。其实大部分时间内,只要你的测试 类遵循通用的命令约定(以Test结尾、以TestCase结尾、或者以Test开头),就几乎不用知晓该插件的存在。然而在当你想要跳过测试、排除某些 测试类、或者使用一些TestNG特性的时候,了解maven-surefire-plugin的一些配置选项就很有用了。例如 mvn test -Dtest=FooTest 这样一条命令的效果是仅运行FooTest测试类,这是通过控制maven-surefire-plugin的test参数实现的。如:

<plugin>

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

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

        <version>2.4.3</version>

  <configuration>  

  <classesDirectory>${project.build.directory}/generated-classes/emma/classes</classesDirectory>

<forkMode>perTest</forkMode>

<useSystemClassLoader>false</useSystemClassLoader>

  </configuration>

 </plugin> 

 

3. maven-antrun-plugin让用户在maven中运行ant任务(http://maven.apache.org/plugins/maven-antrun-plugin/

maven-antrun-plugin能让用户在Maven项目中运行Ant任务。用户可以直接在该插件的配置以Ant的方式编写Target,然后交 给该插件的run目标去执行。在一些由Ant往Maven迁移的项目中,该插件尤其有用。此外当你发现需要编写一些自定义程度很高的任务,同时又觉得 Maven不够灵活时,也可以以Ant的方式实现之。maven-antrun-plugin的run目标通常与生命周期绑定运行。

如:<plugin>

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

           <executions>

             <execution>

               <phase>test</phase>

               <goals>

                 <goal>run</goal>

               </goals>

               <configuration>

                 <tasks>

                   <delete file="${project.build.outputDirectory}/cms_core_config.properties"/>

                   <copy file="src/main/resources/${config.lookup.name}"

                         tofile="${project.build.outputDirectory}/cms_core_config.properties"/>

...

                 </tasks>

               </configuration>

             </execution>

           </executions>

         </plugin>

 

 

在Antrun插件中使用多个execution:

<build>  
    <plugins>  
        <plugin>  
            <artifactId>maven-antrun-plugin</artifactId>  
            <executions>  
                <execution>  
                    <id>package</id>  
                    <phase>package</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo message="make ..."/>  
                            <exec dir="src/main/c" executable="make" failonerror="true" />  
                        </tasks>  
                    </configuration>  
                </execution>  
                <execution>  
                    <id>clean</id>  
                    <phase>clean</phase>  
                    <goals>  
                        <goal>run</goal>  
                    </goals>  
                    <configuration>  
                        <tasks>  
                            <echo message="make clean ..."/>  
                            <exec dir="src/main/c" executable="make" failonerror="true">  
                                <arg line="clean"/>  
                            </exec>  
                        </tasks>  
                    </configuration>  
                </execution>  
            </executions>  
        </plugin>  
    </plugins>  
</build>  
...  
 

代码中定义了两个execution节点,分别执行原来Makefile中定义的make和make clean。这里可以将tasks节点定义成任意自己想要运行的ant任务;

* 在第一个execution节点下,把phase定义成package,goal定义成run,是为了使在运行"mvn package"的时候自动执行第一个execution节点下的ant任务;

* 在第二个execution节点下,把phase定义成clean,goal定义成run,是为了使在运行"mvn clean"的时候自动执行第二个execution节点下的ant任务。

 

4. maven-archetype-plugin(http://maven.apache.org/archetype/maven-archetype-plugin/)

 

Archtype指项目的骨架,Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手。可能也有人看到一些文档写了mvn archetype:create, 但实际上create目标已经被弃用了,取而代之的是generate目标,该目标使用交互式的方式提示用户输入必要的信息以创建项目,体验更好。 maven-archetype-plugin还有一些其他目标帮助用户自己定义项目原型,例如你由一个产品需要交付给很多客户进行二次开发,你就可以为 他们提供一个Archtype,帮助他们快速上手。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics