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,帮助他们快速上手。
相关推荐
在本项目中,我们将探讨如何使用Maven构建和管理Wowza插件的开发过程。Maven是一个流行的Java项目管理和集成工具,它帮助开发者自动化构建、依赖管理和项目信息管理。 首先,让我们深入了解Wowza插件的开发。Wowza...
5. **插件系统**:Maven 使用插件来执行具体任务,如编译源代码、运行测试、打包应用等。插件通过goal(目标)来执行特定功能,可以在POM中配置。 6. **继承与聚合**:通过POM的`<parent>`和`<modules>`标签,可以...
Apache Maven 是一个强大的项目管理和构建工具,主要用于Java应用程序的开发。在Java生态系统中,Maven通过简化项目的构建、依赖管理以及文档生成等过程,极大地提高了开发效率。标题"apache-maven-3.1.0"指的是...
Apache Maven 是一个强大的Java项目管理和综合工具,它简化了构建过程,通过标准化项目结构和自动化构建生命周期来管理依赖关系。Maven 3.5.4是该工具的一个稳定版本,提供了许多改进和优化,旨在提高开发效率和协作...
在实际开发中,我们还可以通过Maven的插件系统扩展其功能,如使用`maven-javadoc-plugin`生成API文档,`maven-source-plugin`打包源代码,以及`maven-site-plugin`生成项目站点等。 对于Maven-3.2.5这个特定版本,...
Apache Maven 是一个强大的项目管理和构建工具,广泛应用于Java开发领域。Maven通过提供一个标准化的项目对象模型(Project Object Model,POM)以及一套插件,使得构建、依赖管理和文档生成变得简单易行。在本文中...
【标题】"maven+...在学习过程中,不断实践是关键,通过创建自己的项目并应用所学知识,你会逐渐掌握这两个强大的工具。同时,遇到问题时,查阅官方文档、参与社区讨论和阅读相关博客文章都能加速你的学习进度。
- **Maven插件和目标(Plugins and Goals)**:Maven插件由一组目标组成,每个目标代表了一个具体的构建动作。 - **Maven生命周期(Lifecycle)**:Maven定义了一系列的构建阶段,按照一定的顺序执行。例如,`validate`...
随着Gradle等新型构建工具的崛起,Maven也在不断改进以应对这些挑战,例如增加对多模块项目的支持和提供更灵活的配置方式。 综上所述,Maven是一个功能强大的项目管理工具,通过POM、依赖管理、构建生命周期、插件...
** Maven详解:构建Java项目的利器 ** ...随着开源社区的不断发展,Maven已成为许多大型项目和企业级应用的标准构建工具。无论你是个人开发者还是团队,掌握Maven都能让你的项目管理更加得心应手。
** Maven2 快速入门教程 ** Maven是Apache软件基金会开发的一款项目管理和集成工具,主要应用于Java项目。Maven2是Maven的第一个稳定版本,它极大地...在实际应用中,不断实践和探索,你会发现更多Maven的便利之处。
在IT行业中,Maven是一个广泛使用的项目管理和综合工具,尤其在Java开发领域。它通过一个中央仓库和约定优于配置的原则,极大地简化了构建过程。HAP框架,全称为High Availability and Performance Framework,可能...
Maven是Java领域中广泛使用的构建工具,它简化了项目的构建、依赖管理和生命周期过程。这篇教程将带你从零开始,逐步了解Maven的核心概念和...通过不断实践和学习,你将能够熟练运用Maven进行项目管理,提升开发效率。
IntelliJ IDEA是一款强大的Java开发集成环境,支持多种...在开发过程中,不断学习和掌握各种工具的使用技巧,能显著提高开发效率和项目质量。希望这篇文章对您在学习和工作中有所帮助,更多相关内容可继续探索和实践。
### Maven3实战笔记02:项目需求和模块分析 在Maven3的实战学习中,第二部分着重于项目需求分析与...在实际操作中,不断优化需求分析方法,灵活运用Maven的多模块管理技巧,将有助于构建更加健壮、高效的软件系统。
- **项目维护与管理难度增加**:随着项目业务的不断扩展,所有业务代码集中在一个项目中会导致项目变得庞大且复杂,从而增加了项目维护与管理的难度。 - **组件复用困难**:如果项目中包含大量通用组件,但这些组件...
NetBeans同样支持Maven插件,使得开发者可以在NetBeans中直接使用Maven的功能。安装方法与Eclipse类似,通过NetBeans的插件管理器进行安装。 **2.7 Maven安装最佳实践** - **统一安装位置:** 为了便于管理和维护...