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