你们好,我是Java最全面试题库
的提裤姐,今天这篇是Java工具系列的第二篇,主要总结了maven
相关的问题,在后续,会沿着第一篇开篇的知识线路一直总结下去,作到日更!若是我能作到百日百更,但愿你也能够跟着百日百刷,一百天养成一个好习惯。java
Maven是基于POM(工程对象模型),经过一小段描述来对项目的代码、报告、文件进管理的工具。
Maven是一个跨平台的项目管理工具
,它是使用java开发的,它要依赖于jdk1.6及以上
Maven主要有两大功能:管理依赖
、项目构建
。(依赖指的是jar包)web
优势:面试
缺点:spring
compile
:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。test
:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。provided
:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,通常的web工程运行时都使用容器的servlet-api。runtime
:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。system
:不从maven仓库获取该jar,而是经过systemPath指定该jar的路径。import
:用于一个dependencyManagement对另外一个dependencyManagement的继承。groupId
:定义当前 Maven 项目隶属的实际项目。artifactId
:该元素定义当前实际项目中的一个 Maven 项目(模块)。推荐的作法是使用实际项目名称做为 artifactId 的前缀。好比上例中的 junit ,junit 就是实际的项目名称,方便并且直观。在默认状况下,Maven 生成的构件,会以 artifactId 做为文件头。例如 junit-3.8.1.jar ,使用实际项目名称做为前缀,就能方便的从本地仓库找到某个项目的构件。version
:该元素定义了使用构件的版本。packaging
:定义 Maven 项目打包的方式,使用构件的什么包。打包方式一般与所生成构件的文件扩展名对应。classifier
:该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应。api
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有三套相互独立的生命周期,分别是 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
:将项目站点发布到服务器maven
各个生命周期相互独立,一个生命周期的阶段先后依赖。
mvn clean :调用 Clean 生命周期的 clean 阶段,实际执行 pre-clean 和 clean 阶段
mvn test :调用 Default 生命周期的 test 阶段,实际执行 test 以及以前全部阶段
mvn clean install :调用 Clean 生命周期的 clean 阶段和 Default 生命周期 的 install 阶段,实际执行 pre-clean 和 clean ,install 以及以前全部阶段。
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删掉。
依赖路径最短优先原则
项目依赖了两个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仓库有2种
Maven 会先搜索本地仓库(repository),发现本地没有而后从远程仓库(中央仓库)获取。私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 须要下载构件的时候,它从私服请求,若是私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上以后,再为 Maven 的下载请求提供服务。咱们还能够把一些没法从外部仓库下载到的构件上传到私服上。