Maven面试题

简介: 什么是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 坐标的含义?

<groupId>junit</groupId> 
<artifactId>junit</artifactId> 
<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 点:

依赖管理系统

多模块构建

一致的项目结构

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



相关文章
|
1月前
|
存储 Java 项目管理
Maven-高频面试题
Maven-高频面试题
|
2月前
|
Java 程序员 应用服务中间件
程序员的31大Maven面试问题及答案
程序员的31大Maven面试问题及答案
|
2月前
|
Java jenkins 测试技术
Maven面试题及答案
Maven面试题及答案
45 0
|
存储 缓存 Java
搞懂这7个Maven问题,带你吊打面试官!
在如今的互联网项目开发当中,特别是Java领域,可以说Maven随处可见。Maven的仓库管理、依赖管理、继承和聚合等特性为项目的构建提供了一整套完善的解决方案,可以说如果你搞不懂Maven,那么一个多模块的项目足以让你头疼,依赖冲突就会让你不知所措,甚至搞不清楚项目是如何运行起来的....
153 0
搞懂这7个Maven问题,带你吊打面试官!
|
26天前
|
Java Apache Maven
Maven 项目文档
在`C:/MVN/consumerBanking`中创建Maven Java项目,使用命令`mvn archetype:generate`生成基础结构。确保`pom.xml`包含`maven-site-plugin`和`maven-project-info-reports-plugin`,版本至少为3.3和2.7,以避免`NoClassDefFoundError`。运行`mvn site`生成文档。
|
18天前
|
Java Maven
Maven如何创建Maven web项目
Maven如何创建Maven web项目
|
21天前
|
Java Apache Maven
Maven 项目文档
使用Maven创建`consumerBanking`项目,执行`mvn archetype:generate`命令初始化。确保`pom.xml`包含`maven-site-plugin`至少版本3.3和`maven-project-info-reports-plugin`至少版本2.7,以避免NoClassDefFoundError。升级插件解决文档构建问题。
|
26天前
|
Java Apache Maven
Maven 项目文档
在`C:/MVN/consumerBanking`,使用`mvn archetype:generate`命令创建Java项目后,确保更新`pom.xml`,添加`maven-site-plugin`和`maven-project-info-reports-plugin`,至少版本3.3和2.7。运行`mvn site`时遇到`NoClassDefFoundError`,需升级`maven-site-plugin`至3.3以上以解决。
|
21天前
|
存储 安全 Java
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
34 4
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
|
3天前
|
Java Apache Maven
Maven 项目文档
确保 `pom.xml` 包含 `maven-site-plugin` 和 `maven-project-info-reports-plugin`,至少版本为 3.3 和 2.7,以避免 `NoClassDefFoundError`。升级插件解决可能的版本问题。