11个使用开发工具Maven的常见提升

  • A+
所属分类:开发工具
毫无疑问,Maven是Java生态系统中最流行的软件项目构建自动化工具。长期以来,它已经取代了Ant,这归功于一个更简单和声明性的项目管理模型,提供了依赖关系管理和解决方案,以及定义良好的构建阶段,例如compile和test,以及对插件的支持,这些插件可以执行与构建、配置和部署代码相关的任何操作。

多年来,许多使用场景和命令对我在基于Maven的项目中非常有用。以下是一些有助于更有效地使用Maven的使用技巧。还有更多的东西,很明显,人们每天都可以为一个特定的用例学习一些新的东西,但我认为这些是可以普遍应用的。这里的重点是命令行使用、解决某个问题或简化重复任务等方面。因此,您将不会发现像使用dependencyManagement来集中依赖关系,这是相当基本的,并且在最初组成POM时更多地使用。

1.获取项目的依赖树

这是一个不费脑筋的问题,但它是解决依赖相关问题的关键,例如使用错误的版本。它在dependency:tree目标maven-dependency-plugin。只需运行以下命令行即可显示当前项目中使用的所有依赖项的树(可选地使用less若要滚动结果,假设您正在处理一个足够大的项目):
注意,在像Eclipse这样的IDE中,这种依赖关系的层次结构可以在POM编辑器中可视化。例如,在Eclipse中,它可以在POM编辑器的“依赖层次结构”选项卡上查看。

2.分析属地

在POM中声明项目实际使用的依赖项是很好的做法,而且通常您希望显式声明项目使用的依赖项,即使它们是过渡性。这使POM变得更干净,就像删除未使用的导入并为您在Java代码中使用的类型声明这些导入一样。要做到这一点,要么运行dependency:analyze目标作为一个独立的命令:

每当插件发现POM中声明的未使用的依赖项或未声明的已使用依赖项时,输出中都会显示警告。如果由于此原因需要引发构建失败,则参数failOnWarning可以设置为true:
另一种方法是使用dependency:analyze-only目标,它做同样的事情,但它应该在构建生命周期中使用,也就是说,它可以集成到项目的POM中:

3.在本地构建期间跳过测试

在开发机器上构建项目时,您可能希望跳过现有的单元测试和集成测试,这可能是因为您希望更快地构建代码,或者因为您暂时不关心测试。也许你只想在你觉得你的提交的第一个草稿准备好接受测试之后才运行测试。请注意,这绝不应在构建并部署到生产环境或暂存环境的CI/CD机器上完成。有两个备选方案需要考虑:

1. 跳过测试的运行:你可以用mvn package -DskipTests=true。或者,您可以将该属性缩短为-DskipTests.

2. 跳过测试的编译和运行(不建议):你可以用mvn package -Dmaven.test.skip=true。你可以把财产缩短到-Dmaven.test.skip.

后者跳过了与测试相关的整个任务(编译和运行测试),因此它可能使构建速度稍微快一些,但-DskipTests而是建议,因为它允许您检测在编译时破坏测试的更改。这通常很重要,因为早期发现和修复错误可能最终需要对主代码中的更改进行重新迭代,或者进行一些重构以使代码更易于测试。

考虑并行运行测试,如安全插件文档。这是一个更好的长期解决方案,但代价是您应该确保并行测试是独立的,不会导致并发问题,因为它们将共享相同的JVM进程。

4.调试单元测试

上述属性由maven-插件,负责运行单元测试。在test构建生命周期的阶段。有时,您不希望在IDE中调试失败的测试,因为您和我一样,并不总是相信IDE是使用新的更改运行测试。有时,您有一个命令行窗口,只想坚持它。在这种情况下,将一个属性传递给插件,如下所示:
这将导致插件侦听端口5005上的远程调试器。现在,你可以在IDE中配置远程调试连接到侦听插件并在调试模式下执行测试。如果您需要对集成测试进行同样的测试,只需使用以下属性即可。-Dmaven.failsafe.debug相反。名称来自maven-failsafe-plugin,负责运行集成测试。

5.运行特定测试

因此,您调试了一个失败的测试并修复了这个失败,现在,您希望重新运行它以确保它是成功的。若要告诉“尽命之火”只运行该特定测试,则test参数可以在命令行上传递:
根据的文件test目标的插件,test参数可用于进一步控制要执行的特定测试方法:

6.从项目中恢复生成

我犹豫不决是否包括这个,因为它看起来微不足道,Maven通常在构建失败时将它指向用户,但我认为它仍然值得列出。每当生成中发生错误,并修复它并希望重新运行生成时,选项-rf,后面跟着冒号和失败模块的名称,可以用于从失败模块恢复生成,以避免重新构建已经成功构建的模块:

7.repository & dependency

maven里面有一个repository的概念,当我们的项目依赖于某个jar时,maven会去repository里面去找。repository分两种,一种是远程的,一种是本地的。如果有几个project都用到junit,我们可以把junit放在repository里面,几个project可以公用,节约存储空间而且方便管理,这个repository的位置可以在pom.xml里面设置。

本地的默认的路径是安装用户的目录下的 .m2\repository 文件夹。如果一个依赖项在本地的repository里面没有,那么maven会去他自己的远程的repositoryhttp://repo.maven.apache.org/maven2 去下载后放到本地的repository里面。

也就是说,我们如果我们的project需要要引用一个依赖项,我们只需要在pom.xml文件中进行配置,maven会自动帮我们去引用。 我们之前的创建project里面需要写单元测试,引用到了junit,看pom中的配置:

1
2
3
4
5
6
7
8
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
        <scope>test</scope>
    </dependency>
</dependencies>

每一个需要为每一个 dependency 指明groupId,artifactId,version。scope很简单,意思是说我们需要怎么引用,比如我们上面的例子里面设置的是test,意思是说只在test里面引用junit。 但是我们如何知道groupId,artifactId和version呢? 比如我现在想引用log4j,这个几个值怎么填? 可以去http://mirrors.ibiblio.org/maven2/ 上去查找。比如log4j,我们就在上面这个地址加上log4j,也就是http://mirrors.ibiblio.org/maven2/junit/。进去后会有一个maven-metadata.xml,打开就可以知道这些值了然后添加这个dependency了。

如果要把一个project安装到本地的repository里面,可以执行下面的命令:

mvn install

到这里就说完了创建,编译,测试,打包以及安装,大部分的项目也就是做这些事情。

再介绍几个其它命令:

  1. mvn site : 为你的project创建一个站点
  2. mvn clean: 清除target目录下的所有文件
  3. mvn eclipse:eclipse :为project生成eclipse的工程文件和classpath文件

8.有效POM

与在您的多模块项目中以不同级别导航多个POM文件和/或在依赖项本身中定义的POM文件不同,相反,一个简单的命令可以显示由当前POM的整个配置快照组成的有效POM,包括从父POM继承的信息,例如属性、插件、依赖信息和配置文件等属性、插件、依赖关系信息和配置文件。
在Eclipse中,可以通过单击默认POM编辑器中标有“有效POM”的底部选项卡查看它。

9.构建特定模块及其依赖关系

对于具有许多依赖模块的多模块项目,您可能希望显式地指定要构建哪些模块,而忽略其他模块。例如,您只想构建一个或两个与其依赖关系一起工作的模块,而不是构建整个模块列表。而不是仅仅做mvn clean install在聚合器POM中,可以使用-pl命令行选项。例如,只构建模块db-impl,您可以执行以下命令:
选择-am,简称--also-make中的列表所需的项目。-pl.

10.配置JVM内存

在构建项目之前,Maven将分析其模块层次结构,以构造一个依赖关系图,该图指定构建这些单独模块的顺序。有时,这个分析步骤可能需要比分配给Maven的JVM进程的默认内存更多的内存,从而导致Java堆空间错误。若要配置这些内存设置,请将MAVEN_OPTS可以设置环境变量:

11.调试Maven插件

由于Maven具有丰富的插件生态系统,而且开发自定义插件很容易,因此开发人员可能需要调试这些插件的问题。如果将插件的源代码导入到IDE中,则可以在调试模式下使用mvnDebug可执行文件(例如:mvnDebug clean install),Maven将等待IDE中的远程调试器附加到端口8000上。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: