`
Josh_Persistence
  • 浏览: 1646222 次
  • 性别: 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,帮助他们快速上手。

分享到:
评论

相关推荐

    Wowza插件开发和Maven的集成示例项目

    在本项目中,我们将探讨如何使用Maven构建和管理Wowza插件的开发过程。Maven是一个流行的Java项目管理和集成工具,它帮助开发者自动化构建、依赖管理和项目信息管理。 首先,让我们深入了解Wowza插件的开发。Wowza...

    apache-maven-3.2.3

    5. **插件系统**:Maven 使用插件来执行具体任务,如编译源代码、运行测试、打包应用等。插件通过goal(目标)来执行特定功能,可以在POM中配置。 6. **继承与聚合**:通过POM的`&lt;parent&gt;`和`&lt;modules&gt;`标签,可以...

    apache-maven-3.5.4-bin.tar

    Apache Maven 是一个强大的Java项目管理和综合工具,它简化了构建过程,通过标准化项目结构和自动化构建生命周期来管理依赖关系。Maven 3.5.4是该工具的一个稳定版本,提供了许多改进和优化,旨在提高开发效率和协作...

    apache-maven-3.1.0

    Apache Maven 是一个强大的项目管理和构建工具,主要用于Java应用程序的开发。在Java生态系统中,Maven通过简化项目的构建、依赖管理以及文档生成等过程,极大地提高了开发效率。标题"apache-maven-3.1.0"指的是...

    Maven-3.2.5, 64位

    在实际开发中,我们还可以通过Maven的插件系统扩展其功能,如使用`maven-javadoc-plugin`生成API文档,`maven-source-plugin`打包源代码,以及`maven-site-plugin`生成项目站点等。 对于Maven-3.2.5这个特定版本,...

    maven3.6.3.zip

    Apache Maven 是一个强大的项目管理和构建工具,广泛应用于Java开发领域。Maven通过提供一个标准化的项目对象模型(Project Object Model,POM)以及一套插件,使得构建、依赖管理和文档生成变得简单易行。在本文中...

    maven+springside 开发入门

    【标题】"maven+...在学习过程中,不断实践是关键,通过创建自己的项目并应用所学知识,你会逐渐掌握这两个强大的工具。同时,遇到问题时,查阅官方文档、参与社区讨论和阅读相关博客文章都能加速你的学习进度。

    Maven 项目管理工具

    随着Gradle等新型构建工具的崛起,Maven也在不断改进以应对这些挑战,例如增加对多模块项目的支持和提供更灵活的配置方式。 综上所述,Maven是一个功能强大的项目管理工具,通过POM、依赖管理、构建生命周期、插件...

    maven3.0.3

    ** Maven详解:构建Java项目的利器 ** ...随着开源社区的不断发展,Maven已成为许多大型项目和企业级应用的标准构建工具。无论你是个人开发者还是团队,掌握Maven都能让你的项目管理更加得心应手。

    maven2快速入门教程

    ** Maven2 快速入门教程 ** Maven是Apache软件基金会开发的一款项目管理和集成工具,主要应用于Java项目。Maven2是Maven的第一个稳定版本,它极大地...在实际应用中,不断实践和探索,你会发现更多Maven的便利之处。

    HAP框架-Maven入门手册.zip

    在IT行业中,Maven是一个广泛使用的项目管理和综合工具,尤其在Java开发领域。它通过一个中央仓库和约定优于配置的原则,极大地简化了构建过程。HAP框架,全称为High Availability and Performance Framework,可能...

    从0开始学习maven管理,附公司内部项目管理pom模板

    Maven是Java领域中广泛使用的构建工具,它简化了项目的构建、依赖管理和生命周期过程。这篇教程将带你从零开始,逐步了解Maven的核心概念和...通过不断实践和学习,你将能够熟练运用Maven进行项目管理,提升开发效率。

    IntelliJ IDEA将导入的项目转成maven项目

    IntelliJ IDEA是一款强大的Java开发集成环境,支持多种...在开发过程中,不断学习和掌握各种工具的使用技巧,能显著提高开发效率和项目质量。希望这篇文章对您在学习和工作中有所帮助,更多相关内容可继续探索和实践。

    2024Maven高级操作

    - **项目维护与管理难度增加**:随着项目业务的不断扩展,所有业务代码集中在一个项目中会导致项目变得庞大且复杂,从而增加了项目维护与管理的难度。 - **组件复用困难**:如果项目中包含大量通用组件,但这些组件...

Global site tag (gtag.js) - Google Analytics