关于java:026期Java工具面试题二项目管理工具

32次阅读

共计 3290 个字符,预计需要花费 9 分钟才能阅读完成。

开篇介绍

大家好,我是 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 有三套互相独立的生命周期,别离是 CleanDefaultSite。每个生命周期蕴含一些阶段,阶段是有程序的,前面的阶段依赖于后面的阶段。

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 的下载申请提供服务。咱们还能够把一些无奈从内部仓库下载到的构件上传到私服上。

正文完
 0