开篇介绍
大家好,我是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 的下载申请提供服务。咱们还能够把一些无奈从内部仓库下载到的构件上传到私服上。