前言
这是一篇整理收录文,用于整理日常工作中遇到的maven相关的问题,更新比较随缘,遇到了相关内容就记录于此
Maven引申
Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于src/test/java/目录下的测试源码。
用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
多年来Maven社区积累了大量的经验,并随之形成了一个成熟的插件生态圈,Maven官方有两个插件列表,如下:
- GroupId为org.apache.maven.plugins,这里的插件最为成熟,官方入口
- GroupId为org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,官方入口。
Maven默认生命周期
验证(validate) 验证项目是正确的,所有必要的信息可用。
初始化(initialize) 初始化构建状态,例如设置属性或创建目录。
产生来源(generate-sources) 生成包含在编译中的任何源代码。
流程源(process-sources) 处理源代码,例如过滤任何值。
生成资源(generate-resources) 生成包含在包中的资源。
流程资源(process-resources) 将资源复制并处理到目标目录中,准备打包。
编译(compile) 编译项目的源代码。
工艺类(process-classes) 从编译后处理生成的文件,例如对Java类进行字节码增强。
生成测试来源(generate-test-sources) 生成包含在编译中的任何测试源代码。
流程测试来源(process-test-sources) 处理测试源代码,例如过滤任何值。
生成测试资源(generate-test-resources) 创建测试资源。
流程测试资源(process-test-resources) 将资源复制并处理到测试目标目录中。
测试编译(test-compile) 将测试源代码编译到测试目标目录中
流程检验类(process-test-classes) 从测试编译中处理生成的文件,例如对Java类进行字节码增强。对于Maven 2.0.5及以上版本。
测试(test) 使用合适的单元测试框架运行测试。这些测试不应该要求代码被打包或部署。
制备包(prepare-package) 在实际包装之前,执行必要的准备包装的操作。这通常会导致打包的处理版本的包。(Maven 2.1及以上)
打包(package) 采取编译的代码,并以其可分发的格式(如JAR)进行打包。
预集成测试(pre-integration-test) 在执行集成测试之前执行所需的操作。这可能涉及诸如设置所需环境等。
集成测试(integration-test) 如果需要,可以将该包过程并部署到可以运行集成测试的环境中。
整合后的测试(post-integration-test) 执行集成测试后执行所需的操作。这可能包括清理环境。
校验(verify) 运行任何检查以验证包装是否有效并符合质量标准。
安装(install) 将软件包安装到本地存储库中,以作为本地其他项目的依赖关系。
部署(deploy) 在集成或发布环境中完成,将最终软件包复制到远程存储库,以与其他开发人员和项目共享。
文章目录
- 前言
- Maven引申
- Maven默认生命周期
- 一、更新依赖源码【dependency:sources】
- 二、项目导入【mvn eclipse:eclipse】【mvn idea:idea】
- 三、maven项目中调用ant任务【maven-antrun-plugin】
- 四、项目骨架搭建【maven-archetype-plugin】
- 五、项目集成【maven-assembly-plugin】
- 六、项目依赖管理【maven-dependency-plugin】
- 七、项目规则管理【maven-enforcer-plugin】
- 八、项目辅助工具【maven-help-plugin】
- 九、项目自动化发布工具【maven-release-plugin】
- 十、maven-jar-plugin:3.2.0 提示 “failed: A required class was missing while executing org.apache.maven.plugins:maven-jar-plugin:3.2.0:jar: org/codehaus/plexus/util/StringUtils”
- 十一、代码质量控制插件【maven-pmd-plugin】
- 十二、工程版本控制插件【versions-maven-plugin】
- 十三、冲突管理插件【dependency-mediator-maven-plugin】
- 十四、工程质量检测插件【clirr-maven-plugin】
- 十五、代码静态检查插件【maven-checkstyle-plugin】
- 十六、文件脱敏检查插件【apache-rat-plugin】
- 十七、关于war 与 war exploded 的区别
- 十八、关于Maven仓库代理“mirror”
- 十九、关于“reporting”标签的作用
- 二十、Maven日常小技巧
一、更新依赖源码【dependency:sources】
指令:mvn dependency:sources
二、项目导入【mvn eclipse:eclipse】【mvn idea:idea】
将maven项目导入到eclipse
mvn eclipse:eclipse
将maven项目导入到Idea
mvn idea:idea
三、maven项目中调用ant任务【maven-antrun-plugin】
功能说明:该插件能让用户在Maven项目中运行Ant任务。用户可以直接在该插件的配置以Ant的方式编写Target,然后交给该插件的run目标去执行。在一些由Ant往Maven迁移的项目中,该插件尤其有用。此外当你发现需要编写一些自定义程度很高的任务,同时又觉得Maven不够灵活时,也可以以Ant的方式实现之。maven-antrun-plugin的run目标通常与生命周期绑定运行。
插件地址:maven-antrun-plugin
Demo代码:调用一个ant任务,将打包好的文件发送到指定的FTP
四、项目骨架搭建【maven-archetype-plugin】
功能说明:Maven初学者最开始执行的Maven命令可能就是mvn archetype:generate,这实际上就是让maven-archetype-plugin生成一个很简单的项目骨架,帮助开发者快速上手,maven-archetype-plugin还有一些其他目标帮助用户自己定义项目原型,例如你由一个产品需要交付给很多客户进行二次开发,你就可以为他们提供一个Archtype,帮助他们快速上手
指令:mvn archetype:generate
五、项目集成【maven-assembly-plugin】
功能说明:maven-assembly-plugin的用途是制作项目分发包,该分发包可能包含了项目的可执行文件、源代码、readme、平台脚本等等。maven-assembly-plugin支持各种主流的格式如zip、tar.gz、jar和war等,具体打包哪些文件是高度可控的,例如用户可以按文件级别的粒度、文件集级别的粒度、模块级别的粒度、以及依赖级别的粒度控制打包,此外,包含和排除配置也是支持的。maven-assembly-plugin要求用户使用一个名为assembly.xml的元数据文件来表述打包,它的single目标可以直接在命令行调用,也可以被绑定至生命周期。
Demo代码:
assembly.xml文件部分内容,详细请参考官方文档
六、项目依赖管理【maven-dependency-plugin】
功能说明:maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list
能够列出项目最终解析到的依赖列表,dependency:tree
能进一步的描绘项目依赖树,dependency:analyze
可以告诉你项目依赖潜在的问题,如果你有直接使用到的却未声明的依赖,该目标就会发出警告。maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies
能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。
常用指令:
mvn dependency:list
:列出项目最终解析到的依赖列表
mvn dependency:tree
:描绘项目依赖树
mvn dependency:analyze
:分析项目依赖,检查项目依赖潜在的问题
mvn dependency:copy-dependencies
:将项目依赖从本地Maven仓库复制到某个特定的文件夹
七、项目规则管理【maven-enforcer-plugin】
功能说明:团队开发中,你无法保证所有成员都熟悉Maven,那他们做一些比较愚蠢的事情就会变得很正常,例如给项目引入了外部的SNAPSHOT依赖而导致构建不稳定,使用了一个与大家不一致的Maven版本而经常抱怨构建出现诡异问题。maven-enforcer-plugin能够帮助你避免之类问题,它允许你创建一系列规则强制大家遵守,包括设定Java版本、设定Maven版本、禁止某些依赖、禁止SNAPSHOT依赖,只要在同一个父POM下,成员开发中违法了规则,Maven就会报错。
除了标准的规则之外,你还可以扩展该插件,编写自己的规则。maven-enforcer-plugin的enforce目标负责检查规则,它默认绑定到生命周期的validate阶段。
八、项目辅助工具【maven-help-plugin】
功能说明:一个小巧的辅助工具,最简单的help:system
可以打印所有可用的环境变量和Java系统属性。help:effective-pom
和help:effective-settings
最为有用,它们分别打印项目的有效POM和有效settings,有效POM是指合并了所有父POM(包括Super POM)后的XML,当你不确定POM的某些信息从何而来时,就可以查看有效POM。有效settings同理,特别是当你发现自己配置的settings.xml没有生效时,就可以用help:effective-settings来验证。此外,maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息,还有all-profiles目标和active-profiles目标帮助查看项目的Profile。
插件地址:maven-help-plugin
常用指令:
mvn help:system
:打印所有可用的环境变量和Java系统属性
mvn help:effective-pom
:打印项目的有效POM
mvn help:effective-settings
:打印项目的有效settings
九、项目自动化发布工具【maven-release-plugin】
功能说明:帮助自动化项目版本发布,它依赖于POM中的SCM信息。release:prepare
用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform
则是签出标签中的RELEASE源码,构建并发布。版本发布是非常琐碎的工作,它涉及了各种检查,而且由于该工作仅仅是偶尔需要,因此手动操作很容易遗漏一些细节,maven-release-plugin让该工作变得非常快速简便,不易出错。maven-release-plugin的各种目标通常直接在命令行调用,因为版本发布显然不是日常构建生命周期的一部分。
插件地址:maven-release-plugin
十、maven-jar-plugin:3.2.0 提示 “failed: A required class was missing while executing org.apache.maven.plugins:maven-jar-plugin:3.2.0:jar: org/codehaus/plexus/util/StringUtils”
问题说明:在使用install指令过程抛出,查看异常日志如下(说明:更详细的日志可以使用**-X**输出,即mvn install -X)
从日志中可以看出,是plexus-utils-3.3.0.jar包出问题了。
解决方法:
- 删除本地maven库中的对应jar的信息,使之重新下载,例如博主的就是清除本地库目录E:.m2\repository\org\codehaus\plexus\plexus-utils\3.3.0 解决的。
- 若下载不下来,那就需要检查远程库是否有问题。
十一、代码质量控制插件【maven-pmd-plugin】
功能说明:顾名思义,该插件用于扫码不符合规定的代码,需要用到阿里规约的检查,尽管建议大家在客户端自己的IDE中进行了扫描,但是难免会有人忘记。因此,在CI过程中,利用maven插件做一次统一的自动化扫描。
十二、工程版本控制插件【versions-maven-plugin】
功能说明:工程版本相关的操作,例如更新整个工程模块的版本号
十三、冲突管理插件【dependency-mediator-maven-plugin】
功能说明:添加链接描述
十四、工程质量检测插件【clirr-maven-plugin】
功能说明:运行Clirr框架,Clirr 是一种工具,用于检查 Java 库与旧版本的兼容性。基本上你给它两组 jar 文件,然后 Clirr 转储出公共 api 中的更改列表。如果检测到不兼容的 api 更改,可以将 Clirr Ant 任务配置为中断构建。在持续集成过程中,Clirr 可以自动防止意外引入二进制或源代码兼容性问题。
十五、代码静态检查插件【maven-checkstyle-plugin】
功能说明:允许自定义代码的编写规范。
十六、文件脱敏检查插件【apache-rat-plugin】
功能说明:对文件的“license”进行检查,当文件数量少的时候,自己添加相应的证书,就是在第一行添加一下注释。
十七、关于war 与 war exploded 的区别
war包不支持热部署,war exploded支持热部署(热部署就是项目启动后,修改代码,不需要重启项目,修改内容已在项目中体现,热部署可以提高开发效率)。所以一般在服务器上部署项目使用war包,开发时使用war exploded 包。
十八、关于Maven仓库代理“mirror”
示例:
<mirror>
<id>central</id>
<name>central</name>
<mirrorOf>*</mirrorOf>
<url>http://xxx/public/</url>
</mirror>
上述配置配置了一个仓库镜像代理,并且代理了所有仓库地址(即此时工程中所有仓库配置都会被转向该镜像仓库地址),通常情况下这不会有问题,但对于某些指定了仓库地址的工程,并且恰好你的私服地址又未代理其仓库时就会出现无法下载的情况,此时可以通过调整仓库镜像代理匹配规则,即mirrorOf的值,规则如下:
* : 匹配所有
external:* :匹配除本地(http:/localhost or http://127.0.0.1)和file协议(file://)之外的所有库
repo,repo1 :匹配id为repo和repo1的仓库
*,!repo1 = 匹配除id为repo1的仓库
十九、关于“reporting”标签的作用
reporting中的配置作用于Maven的site阶段,用于生成报表。中也可以配置插件<plugins>,并通过一个<plugin>的<reportSet>为该插件配置参数。
注意,对于同时出现在和中的插件,中对该插件的配置也能够在构建过程中生效,即该插件的配置是和中的配置的合并
参考文章:传送门
二十、Maven日常小技巧
依赖下载取消SSL验证:
-Dmaven.wagon.http.ssl.insecure=true
-Dmaven.wagon.http.ssl.allowall=true
-Dmaven.wagon.http.ssl.ignore.validity.dates=true
示例:
mvn compile -Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true -Dmaven.wagon.http.ssl.ignore.validity.dates=true
Maven多线程操作:
mvn install -T 8
路漫漫其修远兮,吾将上下而求索。