文章目录
1、什么是maven?
Maven是一款服务于Java平台的自动化构建工具。
- 构建:以”Java源文件“、”框架配置文件“、”JSP“、”HTML“、”图片“等资源为”原材料“,去“生产”一个可以运行的项目的过程。
- 演化过程:Make-> Ant ->Maven ->Gradle
- 编译:java源文件->编译->Class字节码文件->交给JVM去执行
- 部署:一个项目最终运行的并不是动态Web工程本身,而是这个动态Web工程“编译的结果”
- 搭建:
maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来运行定义在生命周期阶段中插件目标的逻辑。当使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自于一组共享的(或自定义的)插件。
2、Maven能为我们解决什么问题?
目前的技术在开发中存在的问题?
- 1、一个项目就是一个工程
- 如果项目非常庞大,就不适合继续使用package来划分模块。最好是一个模块对应一个工程,利于分工协作。
- 借助Maven可以将一个项目拆分为多个工程。
- 2、项目中需要的jar包需要手动复制、粘贴到WEB_INF/lib目录下
- 带来的问题是:同样的jar包文件重复出现在不同的项目工程中,浪费存储空间;
- 借助maven,可以将jar包仅仅保存在仓库中,有需要使用的工程”引用“这个文件接口,并不需要真的把jar包复制过来。
- 3、jar包需要别人替我们准备好,或到官网下载
- Maven可以以一种规范的方式下载jar包
- 4、一个jar包依赖的其他jar包需要自己手动加入到项目中
- Maven会自动将依赖的jar包导入进来。
3、说说maven有什么优缺点?
优点
- 简化了项目依赖管理
- 易于上手,对于新手来说了解几个常用命令即可满足日常工作
- 便于与持续集成工具(jenkins)整合
- 便于项目升级,无论是项目本身还是项目使用的依赖
- maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点
- Maven是一个庞大的构建系统,学习难度大。(很多都可以这样说,入门容易[优点]但是精通难[缺点]);
- Maven采用约定约定优于配置的策略,虽然上手容易但是一旦出现问题,难于调试;
- 网络环境较差,很多repository无法访问。
4、什么是Maven的坐标?
Maven其中一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。
maven的坐标通过groupId,artifactId,version唯一标志一个构件。groupId通常为公司或组织名字,artifactId通常为项目名称,versionId为版本号。
5、讲一下maven的生命周期
Maven的 生命周期:从我们的项目构建,一直到项目发布的这个过程
6、说说你熟悉哪些maven命令?
mvn archetype:generate 创建Maven项目
mvn compile 编译源代码
mvn deploy 发布项目
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Repository中安装jar
mvn eclipse:eclipse 生成eclipse项目文件
mvnjetty:run 启动jetty服务
mvntomcat:run 启动tomcat服务
mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类
7、如何解决依赖传递引起的版本冲突?
可通过dependency的exclusion元素排除掉依赖
8、说说maven的依赖原则
最短路径原则(依赖传递的路径越短越优先)
pom文件申明顺序优先(路径长度一样,则先申明的优先)
覆写原则(当前pom文件里申明的直接覆盖父工程传过来的)
9、说说依赖的解析机制?
当依赖的范围是 system 的时候,Maven 直接从本地文件系统中解析构件。
根据依赖坐标计算仓库路径,尝试直接从本地仓库寻找构件,如果发现对应的构件,就解析成功。如果在本地仓库不存在相应的构件,就遍历所有的远程仓库,发现后,下载并解析使用。如果依赖的版本是 RELEASE 或 LATEST,就基于更新策略读取所有远程仓库的元数据文件(groupId/artifactId/maven-metadata.xml),将其与本地仓库的对应元合并后,计算出RELEASE 或者 LATEST 真实的值,然后基于该值检查本地仓库,或者从远程仓库下载。如果依赖的版本是 SNAPSHOT,就基于更新策略读取所有远程仓库的元数据文件,将它与本地仓库对应的元数据合并,得到最新快照版本的值,然后根据该值检查本地仓库,或从远程仓库下载。
如果最后解析得到的构件版本包含有时间戳,先将该文件下载下来,再将文件名中时间戳信息删除,剩下 SNAPSHOT 并使用(以非时间戳的形式使用)。
11、说说插件的解析机制
与依赖的构件一样,插件也是基于坐标保存在Maven仓库中。在用到插件的时候会先从本地仓库查找插件,如果本地仓库没有则从远程仓库查找插件并下载到本地仓库。与普通的依赖构件不同的是,Maven会区别对待普通依赖的远程仓库与插件的远程仓库。前面提到的配置远程仓库只会对普通的依赖有效果。当Maven需要的插件在本地仓库不存在时是不会去我们以前配置的远程仓库查找插件的,而是需要有专门的插件远程仓库。