Maven打包构建完全指南一(依赖管理)
前言
Apache Maven是一个软件项目管理和构建工具。基于项目对象模型(POM)的概念,Maven可以从一个核心配置文件管理项目的构建,报告和文档。
虽然近年来Gradle作为后起之秀借着Android的东风大肆扩张,Maven作为主流构建工具的地位还是不可动摇的。我们可以看到很多明星项目都是基于Maven构建的,如Spring Boot。
Maven的适用范围非常广,可以用来编译、构建、管理依赖、打包、运行测试用例形成测试报告、甚至借助插件直接发布到远程Tomcat等。阅读本文需要你对Maven已经有了大体的了解,本文将从Maven的常见使用场景切入,介绍笔者使用过程中的经验和总结,最终提出最佳实践。
第一个Maven项目
脚手架
安装并配置好Maven后,我们可以用Maven的脚手架命令工具来生成第一个Maven项目。
|
|
上面的archetype是Maven仓库中内置的脚手架工具,所谓脚手架就是执行这个预置命令就会初始化好一个项目框架,生成一个项目部模板的工具。在模板中可以定义pom.xml预制的依赖项、构建选项等,你也可以自己创建一个Maven项目脚手架发布到Maven仓库中供他人使用。
当然大多数情况下我们用的是IDE的Maven插件来创建的。在Eclipse中我们创建Maven工程时也可以选择预置的脚手架,这通常需要联网下载,由于某些原因国内访问Maven中央仓库非常慢,因此强烈建议配置为阿里云的Maven镜像。
最佳实践
笔者在创建项目时一般会在上图勾选create simple project,跳过一些花里胡哨的脚手架模板,自己一步步配置的pom才会真正了如指掌。
在接下来的界面上,Eclipse会提供三个选项:
- pom,Maven父工程项目,可以向其中添加Module。
- jar,Java的控制台项目。
- war,Java的Web项目。
选择你需要的项目类型就可以了。
Maven依赖管理
Maven依赖管理可能是最常用的功能之一了,在pom.xml中,通过Maven坐标来引用依赖的jar包,这个坐标的groupId、artifactId和version可唯一确定一个jar包,然后Maven会从配置好的远程仓库中进行下载构建。
|
|
依赖的作用域
上面代码段中的<scope>
选项标识该依赖的作用域,默认scope是compile,scope提供以下选项:
- compile (编译范围)
compile是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。
- provided (已提供范围)
provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个web 应用,你可能在编译 classpath 中需要可用的Servlet API 来编译一个servlet,但是你不会想要在打包好的WAR 中包含这个Servlet API;这个Servlet API jar 由你的应用服务器或者servlet 容器提供。已提供范围的依赖在编译classpath (不是运行时)可用。它们不是传递性的,也不会被打包。
- runtime (运行时范围)
runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要JDBC API jar,而只有在运行的时候才需要JDBC驱动实现。
- test (测试范围)
test范围依赖 在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。
- system (系统范围)划重点,后面踩过坑
system范围依赖与provided 类似,但是你必须显式的提供一个对于本地系统中jar 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)
- import
此范围仅支持<dependencyManagement>
中的pom类型。它表示要使用指定POM的<dependencyManagement>
中的有效依赖项列表替换的依赖项,即预先定义以依赖列表,按需引用,需要Maven2.9版本以上支持。
(未完待续)
- 原文作者:范明勇
- 原文链接:https://blog.fanmuyong.com/post/Maven%E6%89%93%E5%8C%85%E6%9E%84%E5%BB%BA%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97%E4%B8%80/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。