开篇介绍
大家好,我是Java最全面试题库
的提裤姐,今天这篇是Java工具系列的第二篇,主要总结了maven
相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,做到日更!如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。
什么是maven?
Maven是基于POM(工程对象模型),通过一小段描述来对项目的代码、报告、文件进管理的工具。
Maven是一个跨平台的项目管理工具
,它是使用java开发的,它要依赖于jdk1.6及以上
Maven主要有两大功能:管理依赖
、项目构建
。(依赖指的是jar包)
maven优缺点?
优点:
- 简化了项目构建,依赖管理:
- 易于上手
- 便于与持续集成工具(Jenkins)整合
- 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
- 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
- maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等
缺点:
- maven是一个庞大的构建系统,学习难度大。
- maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
- 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。
maven常见的依赖范围有哪些?
-
compile
:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。 -
test
:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。 -
provided
:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。 -
runtime
:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。 -
system
:不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。 -
import
:用于一个dependencyManagement对另一个dependencyManagement的继承。
maven 坐标的含义?
groupId
:定义当前 Maven 项目隶属的实际项目。artifactId
:该元素定义当前实际项目中的一个 Maven 项目(模块)。推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如上例中的 junit ,junit 就是实际的项目名称,方便而且直观。在默认情况下,Maven 生成的构件,会以 artifactId 作为文件头。例如 junit-3.8.1.jar ,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。version
:该元素定义了使用构件的版本。packaging
:定义 Maven 项目打包的方式,使用构件的什么包。打包方式通常与所生成构件的文件扩展名对应。classifier
:该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应。
maven 常用命令?
-
mvn archetype
:create :创建 Maven 项目。 -
mvn compile
:编译源代码。 -
mvn deploy
:发布项目。 -
mvn test-compile
:编译测试源代码。 -
mvn test
:运行应用程序中的单元测试。 -
mvn site
:生成项目相关信息的网站。 -
mvn clean
:清除项目目录中的生成结果。 -
mvn package
:根据项目生成的 jar/war 等。 -
mvn install
:在本地 Repository 中安装 jar 。 -
mvn clean package -Dmaven.test.skip=true
:清除以前的包后重新打包,跳过测试类。
maven构建的过程?
清理 ->编译 ->测试 ->报告 ->打包 ->部署
maven的生命周期?
Maven有三套相互独立的生命周期,分别是 Clean
、Default
和 Site
。每个生命周期包含一些阶段,阶段是有顺序的,后面的阶段依赖于前面的阶段。
Clean 生命周期:
清理项目:pre-clean
:执行清理前需要完成的工作。clean
:清理上一次构建生成的文件。post-clean
:执行清理后需要完成的工作
Default 生命周期:
构建项目:validate
:验证工程是否正确,所有需要的资源是否可用。compile
:编译项目的源代码。test
:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。package
:把已编译的代码打包成可发布的格式,比如 jar、war 等。integration-test
:如有需要,将包处理和发布到一个能够进行集成测试的环境。verify
:运行所有检查,验证包是否有效且达到质量标准。install
:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。deploy
:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。
Site 生命周期:
建立和发布项目站点:pre-site
:生成项目站点之前需要完成的工作site
:生成项目站点文档post-site
:生成项目站点之后需要完成的工作site-deploy
:将项目站点发布到服务器
各个生命周期相互独立,一个生命周期的阶段前后依赖。
mvn clean :调用 Clean 生命周期的 clean 阶段,实际执行 pre-clean 和 clean 阶段
mvn test :调用 Default 生命周期的 test 阶段,实际执行 test 以及之前所有阶段
mvn clean install :调用 Clean 生命周期的 clean 阶段和 Default 生命周期 的 install 阶段,实际执行 pre-clean 和 clean ,install 以及之前所有阶段。
使用“mvn clean package”命令进行项目打包,该命令具体做了什么?
- 使用清理插件:
maven-clean-plugin
执行清理删除已有target目录; - 使用资源插件:
maven-resources-plugin
执行资源文件的处理; - 使用编译插件:
maven-compiler-plugin
编译所有源文件生成class文件至targetclasses目录下; - 使用资源插件:
maven-resources-plugin
执行测试资源文件的处理; - 使用编译插件:
maven-compiler-plugin
编译测试目录下的所有源代码; - 使用插件:
maven-surefire-plugin
运行测试用例;
如何解决冲突?
遇到冲突的时候第一步,要找到 Maven 加载的到时是什么版本的 jar 包,通过mvn dependency:tree
查看依赖树,或者使用 IDEA Maven Helper 插件。
第二步,通过 Maven 的依赖原则来调整坐标在 pom 文件的申明顺序是最好的办法,或者使用将冲突中不想要的 jar 引入的 jar删掉。
Maven依赖原则?
依赖路径最短优先原则
项目依赖了两个jar包,其中A-B-C-D , A-D。由于第二条路径最短,所以项目使用的是第二个D。
pom文件中申明顺序优先
项目依赖了两个jar包,A-B-D ,A-C-D。maven会根据加载顺序。如果先申明了B,在申明了C,那么最后依赖就用A-C-D。
覆写优先
子pom内声明的优先于父pom中的依赖。
说一下maven仓库?
Maven仓库有2种
- 本地仓库
- 远程仓库
Maven 会先搜索本地仓库(repository),发现本地没有然后从远程仓库(中央仓库)获取。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。