Maven 是什么?

  • Maven 主要服务于基于 Java 平台的项目构建、依赖管理和项目信息管理。

Maven有哪些优点和缺点

  • 简化了项目依赖管理:
  • 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作
  • 便于与持续集成工具(jenkins)整合
  • 便于项目升级,无论是项目本身升级还是项目使用的依赖升级。
  • 有助于多模块项目的开发,一个模块开发好后,发布到仓库,依赖该模块时可以直接从仓库更新,而不用自己去编译。
  • maven有很多插件,便于功能扩展,比如生产站点,自动发布版本等。

缺点

  • maven是一个庞大的构建系统,学习难度大
  • maven是一个庞大的构建系统,学习难度大
  • maven采用约定优于配置的策略(convention over configuration),虽然上手容易,但是一旦出了问题,难于调试。
  • 当依赖很多时,m2eclipse 老是搞得Eclipse很卡。
  • 中国的网络环境差,很多repository无法访问,比如google code, jboss 仓库无法访问等。

Maven坐标

  • 一般maven使用[groupID,artifactId,version,packaging]来表示一个项目的某个版本,有时还会使用classifier来表示项目的附属构建,常见的附属构建有javadoc和sources包。

你们项目为什么选用 Maven 进行构建?

  • 首先,Maven 是一个优秀的项目构建工具。使用maven,可以很方便的对项目进行分模块构建,这样在开发和测试打包部署时,效率会提高很多。
  • 其次,Maven 可以进行依赖的管理。使用 Maven ,可以将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递和继承。

Maven 规约是什么?

  • /src/main/java/:Java 源码。
  • /src/main/resource:Java 配置文件,资源文件。
  • /src/test/java/:Java 测试代码。
  • /src/test/resource:Java 测试配置文件,资源文件。
  • /target:文件编译过程中生成的 .class 文件、jar、war 等等。
  • pom.xml:配置文件

Maven 要负责项目的自动化构建,以编译为例,Maven 要想自动进行编译,那么它必须知道 Java 的源文件保存在哪里,这样约定之后,不用我们手动指定位置,Maven 能知道位置,从而帮我们完成自动编译。
遵循“约定>>>配置>>>编码”。即能进行配置的不要去编码指定,能事先约定规则的不要去进行配置。这样既减轻了劳动力,也能防止出错。

Maven常见的依赖范围有哪些?

  1. compile:编译依赖,默认的依赖方式,在编译(编译项目和编译测试用例),运行测试用例,运行(项目实际运行)三个阶段都有效,典型地有spring-core等jar。
  2. test:测试依赖,只在编译测试用例和运行测试用例有效,典型地有JUnit。
  3. provided:对于编译和测试有效,不会打包进发布包中,典型的例子为servlet-api,一般的web工程运行时都使用容器的servlet-api。
  4. runtime:只在运行测试用例和实际运行时有效,典型地是jdbc驱动jar包。
  5. system: 不从maven仓库获取该jar,而是通过systemPath指定该jar的路径。
  6. import: 用于一个dependencyManagement对另一个dependencyManagement的继承。

Maven的生命周期
maven有三套生命周期,分别为:

  1. clean 周期:主要用于清理上一次构建产生的文件,可以理解为删除target目录

  2. 默认周期,
    主要阶段包含:
    process-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
    compile 编译src/main/java下的java文件,产生对应的class,
    process-test-resources 默认处理src/test/resources/下的文件,将其输出到测试的classpath目录中,
    test-compile 编译src/test/java下的java文件,产生对应的class,
    test 运行测试用例,
    package 打包构件,即生成对应的jar, war等,
    install将构件部署到本地仓库,
    deploy 部署构件到远程仓库

  3. site周期
    主要阶段包含
    site 产生项目的站点文档
    site-deploy 将项目的站点文档部署到服务器

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 eclipse:eclipse:生成 Eclipse 项目文件。
  • mvn jetty:run启动: Jetty 服务。
  • mvn tomcat:run:启动 Tomcat 服务。
  • mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类。

用到最多的命令

  • mvn eclipse:clean:清除 Project 中以前的编译的东西,重新再来。
  • mvn eclipse:eclipse:开始编译 Maven 的 Project 。
  • mvn clean package:清除以前的包后重新打包。

Maven 坐标的含义?

<!-- FROM https://github.com/junit-team/junit4/blob/master/pom.xml -->
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13-BETA</version>

Maven 给我们制定了一套规则 —— 使用坐标进行唯一标识。Maven 的坐标元素包括 groupId、artifactId、version、packaging、classfier 。

只要我们提供正确的坐标元素,Maven 就能找到对应的构件,首先去你的本地仓库查找,没有的话再去远程仓库下载。如果没有配置远程仓库,会默认从中央仓库地址(http://repo1.maven.org/maven2)下载构件,该中央仓库包含了世界上大部分流行的开源项目构件,但不一定所有构件都有。

5 个元素中:

  • groupId、artifactId、version是必须定义的。
  • `packaging是可选的(默认为 jar )。
  • classfier是不能直接定义的,需要结合插件使用。

Maven <dependencie />是什么?
<dependencie />,依赖关系。属性如下:

  • groupId:依赖项的 groupId 。

  • artifactId :依赖项的 artifactId

  • version :依赖项的 version

  • scope :依赖项的适用范围。

     compile :默认值,适用于所有阶段(开发、测试、部署、运行),本 jar 会一直存在所有阶段。provided :只在开发、测试阶段使用,目的是不让 Servlet 容器和你本地仓库的 jar 包冲突 。如 servlet.jar 。runtime :只在运行时使用,如 JDBC 驱动,适用运行和测试阶段。test :只在测试时使用,用于编译和运行测试代码,不会随项目发布。system :类似 provided ,需要显式提供包含依赖的 jar 包,Maven 不会在 Repository 中查找它。import :用于一个 <dependencyManagement /> 对另一个 <dependencyManagement /> 的继承。非常重要,通过它,可以实现类似 《Maven Spring BOM (bill of materials)》 的功能。
    
  • exclusions:排除项目中的依赖冲突时使用。

对于一个多模块项目,如果管理项目依赖的版本?

  • 方式一,通过在父模块中声明 和, 然后让子模块通过元素指定父模块,这样子模块在定义依赖是就可以只定义 groupId 和 artifactId,自动使用父模块的 version ,这样统一整个项目的依赖的版本。
  • 继承的方式
  • 方式二,使用 声明 为 import 的依赖,从而引入一个 pom 的 的。具体的,可以看看 《Maven Spring BOM (bill of materials)》文章。
  • 组合的方式

LASTEST、RELEASE、SNAPSHOT 的区别?

  • LASTEST :是指某个特定构件最新的发布版或者快照版(SNAPSHOT),最近被部署到某个特定仓库的构件。
  • RELEASE :是指仓库中最后的一个非快照版本。
  • SNAPSHOT :泛指。如果不 SNAPSHOT ,如果名字不变,本地有了不会从远程拉。如果每次更新都改名字,其他用的人也都改名字,太蛋疼了。

Maven 依赖原则?

  • 1、赖路径最短优先原则。
  • 一个项目 Demo 依赖了两个 jar 包,其中 A-B-C-X(1.0) , A-D-X(2.0) 。由于 X(2.0) 路径最短,所以项目使用的是 X(2.0) 。
  • 2、pom文 件中申明顺序优先。
  • 如果 A-B-X(1.0) ,A-C-X(2.0) 这样的路径长度一样怎么办呢?这样的情况下,Maven 会根据 pom 文件声明的顺序加载,如果先声明了 B ,后声明了 C ,那就最后的依赖就会是 X(1.0) 。
  • 3、覆写优先
  • 子 pom 内声明的优先于父 pom 中的依赖。

如何解决 jar 冲突?

遇到冲突的时候第一步,要找到 Maven 加载的到时是什么版本的 jar 包,通过们 mvn dependency:tree 查看依赖树,或者使用 IDEA Maven Helper 插件。
然后,通过 Maven 的依赖原则来调整坐标在 pom 文件的申明顺序是最好的办法,或者使用将冲突中不想要的 jar 引入的 jar 进行<exclusions> 掉。

什么是 Maven 插件?
Maven 生命周期的每一个阶段的具体实现都是由 Maven 插件实现的。插件通常提供了一个目标的集合,并且可以使用下面的语法执行:mvn [plugin-name]:[goal-name]

Maven 提供了下面两种类型的插件:

  • Build plugins :在构建时执行,并在 pom.xml 的 元素中配置。
  • Reporting plugins :在网站生成过程中执行,并在 pom.xml 的元素中配置。

下面是一些常用插件的列表:

  • clean :构建之后清理目标文件。删除目标目录。
  • compiler :编译 Java 源文件。
  • surefile :运行 JUnit 单元测试。创建测试报告。
  • jar :从当前工程中构建 JAR 文件。
  • war :从当前工程中构建 WAR 文件。
  • javadoc :为工程生成 Javadoc 。
  • antrun :从构建过程的任意一个阶段中运行一个 ant 任务的集合。

什么是 Maven 仓库?
Maven 的仓库只有两大类:

  • 1、本地仓库。
  • 2、远程仓库。在远程仓库中又分成了 3 种:
  • 中央仓库。
  • 私服
  • 其它公共库。

Maven 会先搜索本地仓库(repository),发现本地没有然后从远程仓库(中央仓库)获取。

  • 但中央仓库只有一个,最好从其镜象处下载。国内可以用阿里云下的服务器。【其它公共库】
  • 也有通过 Nexus 搭建的私服进行获取的。【私服】

Maven 中的仓库分为两种,SNAPSHOT 快照仓库和 RELEASE 发布仓库。

  • SNAPSHOT 快照仓库用于保存开发过程中的不稳定版本,RELEASE 正式仓库则是用来保存稳定的发行版本。定义一个组件/模块为快照版本,只需要在 pom 文件中在该模块的版本号后加上 -SNAPSHOT 即可(注意这里必须是大写),如下:

    <groupId>cc.mzone</groupId>
    <artifactId>m1</artifactId>
    <version>0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    
  • Maven 会根据模块的版本号(pom 文件中的 version)中是否带有 -SNAPSHOT 来判断是快照版本还是正式版本。

    • 如果是快照版本,那么在 mvn deploy 时会自动发布到快照版本库中,会覆盖老的快照版本。而在使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,Maven 会自动从镜像服务器上下载最新的快照版本。
    • 如果是正式发布版本,那么在 mvn deploy 时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。

所以,我们在开发阶段,可以将公用库的版本设置为快照版本,而被依赖组件则引用快照版本进行开发,在公用库的快照版本更新后,我们也不需要修改 pom 文件提示版本号来下载新的版本,直接 mvn 执行相关编译、打包命令即可重新下载最新的快照库了,从而也方便了我们进行开发。

什么是私服?

私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。

Maven 私服的 5 个特性:

  • 1、节省自己的外网带宽:减少重复请求造成的外网带宽消耗。
  • 2、加速 Maven 构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低。
  • 3、部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部 Maven 项目使用。
  • 4、提高稳定性,增强控制:Internet 不稳定的时候,Maven 构建也会变的不稳定,一些私服软件还提供了其他的功能。
  • 5、降低中央仓库的负荷:Maven 中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力。

当前主流的 Maven 私服:

  • Apache 的 Archiva
  • JFrog 的 Artifactory
  • 【主流】Sonatype 的 Nexus 。

常见的 Maven 私服的仓库类型:

  • (宿主仓库)hosted repository 。
  • (代理仓库)proxy repository 。
  • (仓库组)group repository 。

如何配置远程仓库?

用文本编辑器工具打开 setting.xml文件,增加一个 <mirror />

<mirrors><mirror><id>nexus-aliyun</id><mirrorOf>*</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</url></mirror>
</mirrors>

Maven基本面试题问答相关推荐

  1. Android 基本面试题

    Android 基本面试题 一.java 核心思想 1.八种基本数据类型和封装类 基本类型 大小(字节) byte 1 short 2 int 4 long 8 float 4 double 8 bo ...

  2. python基础知识面试题-深入解答关于Python的11道基本面试题

    前言 本文给大家深入的解答了关于Python的11道基本面试题,通过这些面试题大家能对python进一步的了解和学习,下面话不多说,来看看详细的介绍吧. 一.单引号,双引号,三引号的区别 分别阐述3种 ...

  3. cocos2d-x基本面试题

    cocos2d-x基本面试题 1.Cocos2d-x是怎样实现跨平台? AppDelegate 作为跨平台程序入口,在这之上做了另一层的封装,封装了不同平台的不同实现.比如我们通常认为一个程序是由 m ...

  4. java数据类型转换方向_java基础学习篇02(数据类型转换和基本面试题)

    JAVA基本数据类型转换 java中的数据类型,分为,引用数据类型和基本数据类型.基本数据类型有8中 整型:byte 8位 . short 16位 .int 32位 .long 64位. (8位=1个 ...

  5. Maven面试题及答案

    1.Maven有哪些优点和缺点 优点: 1.简化项目依赖管理 2.方便与持续集成工具(Jenkins)整合 3.有助于多模块项目开发,比如一个模块开发好后发布到仓库,依赖该模块时可以直接从远程仓库更新 ...

  6. 并发编程(三):线程池基本面试题(必背题目)

    目录 一.背景 二.高频面试题(八股文) 1.什么是线程池?线程池有什么好处(被问概率很小)? 2.有几种常见的线程池(必知必会)? 3.线程池的主要参数有哪些(必知必会)? 4.线程池的工作流程(必 ...

  7. linux基本面试题

    前言 这篇博文参考阿铭linux-28个运维经典面试题,并对其中的一些题目进行扩展和解析. 如有侵权,请联系我删除-再次感谢阿铭老师的分享. 大家有空可以看看阿铭老师的教程- 第一题:Linux如何挂 ...

  8. 【032期】2021年 Java 面试中 Linux 最高频的五个基本面试题

    >>号外:关注"Java精选"公众号,回复"面试资料",免费领取资料!"Java精选面试题"小程序,3000+ 道面试题在线刷, ...

  9. 面试官:这是我准备的一些java后端maven面试题

    文章目录 Maven 的生命周期是什么?在每个生命周期阶段中,Maven 做了什么? 什么是 Maven 坐标?它由哪些元素组成? 如何将本地存储库中的依赖项添加到 Maven 项目中? Maven ...

最新文章

  1. Android模拟器SD卡的使用
  2. 中国二手房行业发展形势与“十四五”前景规划建议报告2022-2028年
  3. android镊 姩瀹夎 apk,用java写的jodconverter借用openoffice来转换office成pdf的示例代码...
  4. MybatisPlus条件构造器说明以及selectPage方法
  5. ftp+线程池批量上传文件
  6. Python学习笔记--数据类型
  7. 用PMML实现机器学习模型的跨平台上线
  8. Sharepoint 2010 隐藏基本搜索中心搜索结果左侧的分类条件
  9. Android样式开发--selector
  10. matlab 中的矩阵分解
  11. select选中值传递到后台action中
  12. Linux与FreeBSD的多网卡绑定增加服务器流量
  13. 数学软件Maple使用教程
  14. 端口错误 给Arduino下载程序提示
  15. windows下批量创建txt文件
  16. 一文读懂华为智能网联汽车产业链布局
  17. 指纹识别算法MZFinger5.0
  18. VC++使用管道重定向进程输入输出(附源码)
  19. C# 代码编辑器实现-概述
  20. ucl计算机学院位置,2017伦敦大学学院设施及地理位置介绍

热门文章

  1. Fritzing - 创建自己的零件(2)
  2. 功能测试必备:抓包工具的作用及常用抓包工具有哪些?
  3. 加油站良好出发点问题
  4. mysql时间戳格式化查询_mysql 查询时间戳格式化
  5. 一、SQL Server列名显示无效却可以运行问题解决?
  6. Adobe Acrobat Reader 窗口一闪而过的解决方法
  7. linux uniq不起作用,linux之uniq用法
  8. 【板绘练习】天使恶魔ヾ(゚∀゚○)ツ线稿练习
  9. 计算机应用(2010)题型,《计算机应用》题(Office 2010版).doc
  10. 明确市场定位让软文营销从针对性出发