• Maven面试题


    什么是maven私服?

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

    Maven 私服的 5 个特性:

    1、节省自己的外网带宽:减少重复请求造成的外网带宽消耗。

    2、加速 Maven 构件:如果项目配置了很多外部远程仓库的时候,构建速度就会大大降低。

    3、部署第三方构件:有些构件无法从外部仓库获得的时候,我们可以把这些构件部署到内部仓库(私服)中,供内部 Maven 项目使用。

    4、提高稳定性,增强控制:Internet 不稳定的时候,Maven 构建也会变的不稳定,一些私服软件还提供了其他的功能。

    5、降低中央仓库的负荷:Maven 中央仓库被请求的数量是巨大的,配置私服也可以大大降低中央仓库的压力。

    什么是 Maven 仓库?

    Maven 的仓库只有两大类:

    1、本地仓库。 2、远程仓库。

    在远程仓库中又分成了 3 种:

    中央仓库。

    私服。

    其它公共库。

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

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

    如何解决 jar 冲突?

    遇到冲突的时候第一步,要找到 Maven 加载的到时是什么版本的 jar 包,通过们 mvn dependency:tree 查看依赖树,或者使用 IDEA Maven Helper 插件。

    然后,通过 Maven 的依赖原则来调整坐标在 pom 文件的申明顺序是最好的办法,或者使用将冲突中不想要的 jar 引入的 jar 进行 掉。

    简单说一下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 中的依赖。

    Maven 坐标的含义?

    1. <groupId>junit</groupId> 
    2. <artifactId>junit</artifactId> 
    3. <version>4.13-BETA</version>

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

    在我们自己开发项目的时候,也是要给我们的项目定义坐标的,这是强制性要求,只有这样,其他项目才能引用该项目的构件。

    groupId :定义当前 Maven 项目隶属的实际项目。首先,Maven 项目和实际项目不一定是一对一的关系。比如 Spring FrameWork 这一实际项目,其对应的 Maven 项目会有很多,如 spring-core、spring-context 等。这是由于 Maven 中模块的概念,因此,一个实际项目往往会被划分成很多模块。其次,groupId 不应该对应项目隶属的组织或公司。原因很简单,一个组织下会有很多实际项目,如果 groupId 只定义到组织级别,而后面我们会看到,artifactId 只能定义 Maven 项目(模块),那么实际项目这个层次将难以定义。最后,groupId 的表示方式与 Java 包名的表达方式类似,通常与域名反向一一对应。上例中,groupId 为 junit ,是不是感觉很特殊,这样也是可以的,因为全世界就这么个 junit ,它也没有很多分支。

    artifactId :该元素定义当前实际项目中的一个 Maven 项目(模块)。推荐的做法是使用实际项目名称作为 artifactId 的前缀。比如上例中的 junit ,junit 就是实际的项目名称,方便而且直观。在默认情况下,Maven 生成的构件,会以 artifactId 作为文件头。例如 junit-3.8.1.jar ,使用实际项目名称作为前缀,就能方便的从本地仓库找到某个项目的构件。

    version :该元素定义了使用构件的版本。如上例中 junit 的版本是 4.13-BETA ,你也可以改为 4.1.2 表示使用 4.1.2 版本的 junit 。

    packaging :定义 Maven 项目打包的方式,使用构件的什么包。打包方式通常与所生成构件的文件扩展名对应。如上例中没有 packaging ,则默认为 jar 包,最终的文件名为junit-4.13-BETA.jar 。当然,也可以打包成 war 等。

    classifier :该元素用来帮助定义构建输出的一些附件。附属构件与主构件对应。如上例中的主构件为 junit-4.13-BETA.jar ,该项目可能还会通过一些插件生成如 junit-4.13-BETA-javadoc.jar、junit-4.13-BETA-sources.jar,这样附属构件也就拥有了自己唯一的坐标。 上述 5 个元素中:

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

    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 clean :清除 Project 中以前的编译的东西,重新再来。

    mvn compile :开始编译 Maven 的 Project 。

    mvn clean package :清除以前的包后重新打包。

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

    首先,Maven 是一个优秀的项目构建工具。使用maven,可以很方便的对项目进行分模块构建,这样在开发和测试打包部署时,效率会提高很多。

    其次,Maven 可以进行依赖的管理。使用 Maven ,可以将不同系统的依赖进行统一管理,并且可以进行依赖之间的传递和继承。

    Maven 是什么?

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

    Maven 的主要功能主要分为 4 点:

    依赖管理系统

    多模块构建

    一致的项目结构

    一致的构建模型和插件机制

  • 相关阅读:
    贪心算法-翻硬币
    Flink容错机制
    QT day2
    【二叉树系列】插入&删除&修剪&有序数组转二叉搜索树&二叉搜索树转换为累加树
    atsec at the PCI Community Meeting 2023
    yalmip和cplex安装步骤(Matlab)
    Spring之IoC
    客快物流大数据项目(七十一):impala-shell命令参数
    [附源码]java毕业设计全国人口普查管理系统论文
    龙测票选,5本最受欢迎的软件测试书籍
  • 原文地址:https://blog.csdn.net/weixin_39570751/article/details/127624384