2023年JAVA面试题【maven】

1. Maven有哪些优点和缺点

优点如下

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

缺点如下:

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

2. Maven坐标

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

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

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

4. 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 将项目的站点文档部署到服务器

4. 我们经常使用“Mvn Clean Package”命令进行项目打包,请问该命令执行了哪些动作来完成该任务?

在这个命令中我们调用了maven的clean周期的clean阶段绑定的插件任务,以及default周期的package阶段绑定的插件任务
默认执行的任务有(maven的术语叫goal, 也有人翻译成目标,我这里用任务啦):

maven-clean-plugin:clean->
maven-resources-plugin:resources->
maven-compile-plugin:compile->
mavne-resources-plugin:testResources->
maven-compile-plugin:testCompile->
maven-jar-plugin:jar

5. 依赖的解析机制

解析发布版本:如果本地有,直接使用本地的,没有就向远程仓库请求。
解析快照版本:合并本地和远程仓库的元数据文件-groupId/artifactId/version/maven-metadata.xml,这个文件存的版本都是带时间戳的,将最新的一个改名为不带时间戳的格式供本次编译使用。
解析版本为LATEST,RELEASE,过于复杂,且解析的结果不稳定, 不推荐在项目中使用,感兴趣的同学自己去研究,简而言之就是合并groupId/artifactId/maven-metadata.xml找到对应的最新版本和包含快照的最新版本。

6. 插件的解析机制

当我们输入"mvn dependency:tree"这样的指令,解析的步骤为:
解析groupID:
maven使用默认的groupID:“org.apache.maven.plugins"或者"org.codehaus.mojo”
解析artifactId(maven的官方叫做插件前缀解析策略)
合并该groupId在所有仓库中的元数据库文件(maven-metadata-repository.xml),比如maven官方插件的元数据文件所在的目录为org\apache\maven\plugins,该文件下有如下的条目

<plugin>
<name>MavenDependencyPlugin</name>
<prefix>dependency</prefix>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>
<plugin>
<name>MavenDependencyPlugin</name>
<prefix>dependency</prefix>
<artifactId>maven-dependency-plugin</artifactId>
</plugin>

通过比较这样的条目,我们就将该命令的artifactId解析为maven-dependency-plugin
解析version
如果你在项目的pom中声明了该插件的版本,那么直接使用该版本的插件,否则合并所有仓库中groupId/artifactId/maven-metadata-repository.xml,找到最新的发布版本。

对于非官方的插件,有如下两个方法可以选择:
1)使用groupId:artifactId:version:goal 来运行,好长~~~~~~~~~~
2)在Settings.xml中添加pluginGroup项,这样maven不能在官方的插件库中解析到某个插件,那么就可以去你配置的group下查找啦。

7. 多模块如何聚合

配置一个打包类型为pom的聚合模块,然后在该pom中使用元素声明要聚合的模块

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

通过在父模块中声明dependencyManagement和pluginManagement, 然后让子模块通过元素指定父模块,这样子模块在定义依赖是就可以只定义groupId和artifactId,自动使用父模块的version,这样统一整个项目的依赖的版本。

9. 一个项目的依赖来源于不同的组织,可能这些依赖还会依赖别的Jar包,如何保证这些传递依赖不会引起版本冲突。

使用的元素将会引起冲突的元素排除。

10. 常见的Maven私服的仓库类型。

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

11. 如何查询一个插件有哪些目标(Goal)

mvn help:describe -Dplugin=groupId:artifactId
from: http://www.javacoder.cn/?p=211

12.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 :清除以前的包后重新打包,跳过测试类。

13.用到最多的命令

mvn clean :清除 Project 中以前的编译的东西,重新再来。

mvn compile :开始编译 Maven 的 Project 。

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

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

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值