是否想了解如何在Java项目中更好地执行Maven构建自动化工具? 优锐课带你了解有关使用Maven的十大技巧的更多信息。
毫无疑问,Maven是Java生态系统中软件项目最受欢迎的构建自动化工具。长期以来,它已经取代了Ant,这归功于一个更简单,声明性的模型来管理项目,提供依赖项管理和解析,定义明确的构建阶段(例如编译和测试)以及对可以执行与构建,配置和部署代码有关的任何操作的插件的支持。据统计,2018年有60%的Java开发人员使用它。
多年以来,在基于Maven的项目上工作时,许多使用场景和命令对我来说非常有用。这里有一些使用技巧,可以帮助你更有效地使用Maven。还有更多,并且显然可以每天为特定用例学习一些新知识,但是我认为这些是可以普遍应用的。这里的重点是诸如命令行用法,解决特定问题或使重复性任务变得更容易等方面。 因此,你将不会发现诸如使用dependencyManagement来集中依赖关系之类的做法,无论如何,它们都是相当基本的,并且在最初组成POM时更多地被使用。
ps:如果你是Maven的新手或没有足够的使用经验,那么最好花一些时间来学习它的基础知识,而不是尝试通过技巧和窍门来学习。
1. 获取项目的依赖树
这很容易,但是对于解决与依赖性相关的问题(例如使用错误的版本)至关重要。 它在maven-dependency-plugin的dependency:tree目标中进行了描述。 你只需运行以下命令行即可显示当前项目中使用的所有依赖项的树(如果你正在处理足够大的项目,则可以选择使用更少的滚动显示结果):
$ mvn dependency tree | less
注意,在像Eclipse这样的IDE中,可以在POM编辑器中可视化这种依赖关系层次结构。 例如,在Eclipse中,可以在POM编辑器的“依赖关系层次”选项卡上查看它。
2. 分析依赖
优良作法是在POM中仅声明项目实际使用的依赖项,并且,通常,你希望显式声明项目使用的依赖项,即使它们被可传递地包括在内。 这使POM变得更干净,就像删除一个未使用的导入并为你在Java代码中使用的类型声明这些导入一样,是一种很好的做法。
为此,可以将dependency:analyze目标作为独立命令运行:
$ mvn dependency:analyze
每当插件找到在POM中声明的未使用的依赖项或未声明的已使用的依赖项时,输出中就会显示警告。如果因此导致构建失败,则可以将参数failOnWarning设置为true:
$ mvn dependency:analyze -DfailOnWarning=true
另一种方法是使用dependency:only-analyze目标,它具有相同的作用,但应在构建生命周期内使用,即可以将其集成到项目的POM中:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>analyze-deps</id>
<goals>
<goal>analyze-only</goal>
</goals>
</execution>
</executions>
</plugin>
3. 在本地构建过程中跳过测试
在开发机器上构建项目时,你可能要跳过现有的单元测试和集成测试,因为你想更快地构建代码,或者因为暂时不关心测试。也许你只想在已经准备好要测试的提交初稿之后才想运行测试。请注意,永远不要在构建并部署到生产或暂存环境的CI / CD机器上执行此操作。
有两个选项可供考虑:
1. 跳过测试的运行:你可以使用mvn包-DskipTests = true来完成测试。 或者,你可以将属性缩短为-DskipTests。
2. 跳过测试的编译和运行(不建议这样做):可以使用mvn软件包-Dmaven.test.skip = true进行测试。你可以将属性缩短为-Dmaven.test.skip。
后者会跳过所有与测试相关的任务(包括编译和运行测试),因此它可能会使构建速度稍快一些,但建议使用-DskipTests,因为它使你可以检测在编译时破坏了测试的更改。这通常很重要,因为尽早发现并修复错误可能最终需要对主代码中的更改进行重复,也许需要进行一些重构以使代码更易于测试。
如Surefire插件文档中所述,考虑并行运行测试。 这是一个更好的长期解决方案,但代价是你应确保并行测试是独立的,并且不会引起并发问题,因为它们将共享同一JVM进程。
4. 调试单元测试
Maven-surefire-plugin可以理解上述属性,该插件负责运行单元测试。该插件在构建生命周期的测试阶段被调用。有时,你不想在IDE中调试失败的测试,因为你和我一样,并不总是相信IDE会通过新更改运行测试。有时,你有一个命令行窗口,只是想坚持下去。在这种情况下,将属性传递给插件,如下所示:
$ mvn clean package -Dmaven.surefire.debug
这将导致插件在端口5005上侦听远程调试器。现在,你可以在IDE中配置远程调试,以连接到侦听插件并以调试模式执行测试。
如果你需要对集成测试执行相同的操作,只需使用属性-Dmaven.failsafe.debuginstead。该名称来自maven-failsafe-plugin,它负责运行集成测试。
5. 运行特定的测试
因此,你调试了失败的测试并修复了失败,现在,你想重新运行它以确保成功。 要告诉Surefire仅运行该特定测试,可以在命令行上传递测试参数:
$ mvn clean package -Dtest=MyTest
根据有关Maven Surefire插件的测试目标的文档,可使用test参数进一步控制要执行的特定测试方法:
$ mvn clean package -Dtest=MyTest#testMethod
6. 从项目恢复构建
- 从项目恢复构建
我在犹豫是否要包含它,因为它看起来微不足道,Maven通常会在构建失败时将其指向用户,但我认为仍然值得列出。 每当构建中发生错误并修复它并想要重新运行该构建时,可以使用选项-rf,冒号和失败模块的名称来从失败模块恢复构建,以避免 重新构建已经成功构建的模块:
$ mvn clean install-rf :db-impl
7. 有效POM
一个简单的命令可以显示有效的POM,而不是在多模块项目中的多个级别上导航多个POM文件和/或在依赖项本身中定义的POM文件,以便找出解决了哪些传递性依赖项或应用了哪种插件配置, 由当前POM的整个配置快照组成,包括从父POM继承的信息,例如属性,插件,依赖项信息和配置文件。
$ mvn help:effective-pom | less
在Eclipse中,可以通过单击默认POM编辑器中底部标有“有效POM”的选项卡来查看它。
8. 构建特定的模块及其依赖性
对于具有许多相关模块的多模块项目,你可能需要明确指定要构建的模块,而忽略其他模块。例如,你只想构建一个或两个正在使用的模块及其依赖关系,而不是构建整个模块列表。你可以使用-plcommand line选项,而不仅仅是从聚合器POM中执行mvn全新安装。 例如,要仅构建模块db-impl,可以执行以下命令:
$ mvn clean install-pl db-impl -am
选项-am是–also-make的简写,它告诉Maven构建-pl中列表所需的项目。
9. 配置JVM内存
在构建项目之前,Maven将分析其模块层次结构,以构建依赖关系图,该依赖关系图指定构建这些单个模块的顺序。有时,此分析步骤可能需要比分配给Maven的JVM进程的默认内存更多的内存,从而导致Java堆空间错误。要配置这些内存设置,可以设置MAVEN_OPTS环境变量:
$ exportMAVEN_OPTS=-Xms256m -Xmx1024m
10. 调试Maven插件
由于Maven具有丰富的插件生态系统,并且易于开发自定义插件,因此很可能处于开发人员需要调试此类插件问题的情况。 假设你的插件的源代码已导入到IDE中,则可以使用mvnDebugexecutable(例如mvnDebug全新安装)在调试模式下运行Maven,并且Maven将等待IDE中的远程调试器连接到端口8000。
结论
了解如何使用Maven这样的构建工具对于充分利用它至关重要,但是有些用例经常会重复出现,因此值得记住这些快速解决方案。如果你还有其他提示,请随时在下面的评论中告诉我们!也可以加入我们Java学习资料交流qq群:907135806进群交流讨论;另外有需要JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java学习资料和视频课程可以加下vx:ddmsiqi领取。
——抽丝剥茧 细说架构那些事【优锐课】