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通过一组插件来实现具体任务,这些插件可以在项目的生命周期的各个阶段被调用。 版本3.8.3是Apache Maven的一个更新版本,相较于早期版本,它带来了更多的改进和新特性。这个版本的Maven适用于不同的操作系统...
标签中提到了“java windows linux maven”,这表明Maven是一个跨平台、跨语言的工具,尽管它主要用于Java项目的管理,但其设计理念和方法同样可以被其他编程语言所借鉴和应用。 随着软件开发的日益复杂,自动化...
Apache Maven 3.6.1 是一款流行的软件项目管理和构建自动化工具,尤其在Java项目开发中占据重要地位。它由Apache软件基金会负责维护,主要功能包括项目对象模型(POM)管理、依赖管理系统、构建生命周期管理和多模块...
几乎每一个Java开发者在进行项目开发时,都会使用到Maven来管理项目依赖和生命周期,它有效地解决了项目构建过程中遇到的依赖管理和自动化构建问题。 Apache Maven是Apache Software Foundation软件基金会的一个...
在本项目中,我们将探讨如何使用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通过一个声明式的配置文件(pom.xml),...
在大型项目中,Maven 通过其强大的生命周期管理和插件系统,帮助团队维持高效的开发流程和一致的构建环境。 随着现代软件开发的发展,Maven 也不断地在演进,提供了更好的性能、更多的特性以及更好的用户体验。...
在实际开发中,我们还可以通过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`...
在深入探讨maven_demo03-javaEE框架项目资源的内容...通过这个项目资源包,开发者不仅可以学习到如何使用Maven管理和构建JavaEE项目,还可以深入了解JavaEE框架在实际应用开发中的运用,从而提升自身的JavaEE开发能力。
20. Maven的未来展望:随着软件开发技术的不断进步,Maven也在持续更新和发展。Maven社区不断推出新特性,优化构建过程和提高用户体验。Maven的未来发展方向将继续是更高效、更智能、更易于使用的构建工具。
随着Gradle等新型构建工具的崛起,Maven也在不断改进以应对这些挑战,例如增加对多模块项目的支持和提供更灵活的配置方式。 综上所述,Maven是一个功能强大的项目管理工具,通过POM、依赖管理、构建生命周期、插件...
** Maven详解:构建Java项目的利器 ** ...随着开源社区的不断发展,Maven已成为许多大型项目和企业级应用的标准构建工具。无论你是个人开发者还是团队,掌握Maven都能让你的项目管理更加得心应手。