干货分享—使用Maven的10条有效技巧

本文分享了使用Maven的十个有效技巧,包括获取依赖树、分析依赖、跳过测试、调试单元测试、运行特定测试、从失败中恢复构建等,旨在帮助Java开发者更高效地使用Maven进行项目构建和管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是否想了解如何在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. 从项目恢复构建

  1. 从项目恢复构建
    我在犹豫是否要包含它,因为它看起来微不足道,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领取。

——抽丝剥茧 细说架构那些事【优锐课】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值