Maven 整理(含面试题)

发布时间:2024年01月03日

Maven是Java 项目必备,Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖

Maven安装与运行

Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。
进入maven官网进行下载 https://maven.apache.org/download.cgi maven
在这里插入图片描述
下载解压后,创建环境变量:
M2_HOME
在这里插入图片描述
MAVEN_HOME
在这里插入图片描述
在Path环境变量中添加:
在这里插入图片描述
注意环境中要有jdk环境,
在这里插入图片描述
创建仓库,文件名可以如下:
在这里插入图片描述
进入conf文件,进行settings.xml配置,需要添加此本地仓库包。
在这里插入图片描述
配置阿里云镜像:
在这里插入图片描述

<mirrors>
    <!-- 阿里云镜像 -->
    <mirror>
      <id>alimaven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
      #或者这个url : https://maven.aliyun.com/repository/public
    </mirror>
  </mirrors>

配置jdk环境:
在这里插入图片描述

<!-- 配置 java 版本 -->
    <profile>
      <id>jdk-1.8</id>
      <activation>
      <activeByDefault>true</activeByDefault>
      <jdk>1.8</jdk>
      </activation>
      <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
      </properties>
    </profile>

在这里插入图片描述

在这里插入图片描述
如果建的时候会报错:
No archetype found in remote catalog. Defaulting to internal catalog

在这里插入图片描述
在setting里面设置:
-DarchetypeCatalog=internal
在这里插入图片描述
这样子就可以了,重启idea,对maven进行重载入。
在这里插入图片描述
运行一下,需要配置tomcat:
在这里插入图片描述
在这里插入图片描述
当然可以使用命令进行创建:

mvn archetype:generate "-DgroupId=com.companyname.bank" "-DartifactId=consumerBanking" "-DarchetypeArtifactId=maven-archetype-quickstart" "-DinteractiveMode=false"

maven 重要知识点

Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
项目构建工具 、更好的管理依赖
Maven 的主要功能主要分为5点:依赖管理系统,多模块构建,一致的项目结构,一致的构建模型和插件机制。
文件创建格式信息:
在这里插入图片描述
在这里插入图片描述
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。

<!-- 模型版本 -->
    <modelVersion>4.0.0</modelVersion>
    <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
    <groupId>com.companyname.project-group</groupId>
 
    <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
    <artifactId>project</artifactId>
 
    <!-- 版本号 -->
    <version>1.0</version>

在这里插入图片描述
Maven 有以下三个标准的生命周期

clean:项目清理的处理 ,删除项目中已经编译好的信息,删除target目录
default(或 build):项目部署的处理
site:项目站点文档创建的处理
Default 生命周期(也称为 Build 生命周期)
在这里插入图片描述
1)validate:验证工程是否正确,所有需要的资源是否可用。
2)compile:编译项目的源代码。
3)test:使用合适的单元测试框架来测试已编译的源代码。这些测试不需要已打包和布署。
4)Package:把已编译的代码打包成可发布的格式,比如jar。
5)integration-test:如有需要,将包处理和发布到一个能够进行集成测试的环境。
6)verify:运行所有检查,验证包是否有效且达到质量标准。
7)install:把包安装到maven本地仓库,可以被其他工程作为依赖来使用。
8)Deploy:在集成或者发布环境下执行,将最终版本的包拷贝到远程的repository,使得其他的开发者或者工程可以共享。

<code>mvn [plugin-name]:[goal-name]</code>
mvn clean dependency:copy-dependencies package

Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
Maven 仓库有三种类型:
默认情况下,不管Linux还是 Windows,每个用户在自己的用户目录下都有一个路径名为 .m2/repository/ 的仓库目录。
本地(local)
中央(central)
远程(remote)

Maven 依赖搜索顺序:
当我们执行 Maven 构建命令时,Maven 开始按照以下顺序查找依赖的库:
步骤 1 - 在本地仓库中搜索,如果找不到,执行步骤 2,如果找到了则执行其他操作。
步骤 2 - 在中央仓库中搜索,如果找不到,并且有一个或多个远程仓库已经设置,则执行步骤 4,如果找到了则下载到本地仓库中以备将来引用。
步骤 3 - 如果远程仓库没有被设置,Maven 将简单的停滞处理并抛出错误(无法找到依赖的文件)。
步骤 4 - 在一个或多个远程仓库中搜索依赖的文件,如果找到则下载到本地仓库以备将来引用,否则 Maven 将停止处理并抛出错误(无法找到依赖的文件)。

常用插件列表
在这里插入图片描述

Maven 使用 archetype(原型) 来创建自定义的项目结构,形成 Maven 项目模板.

Maven命令package、install、deploy的联系与区别 (重要)
mvn clean package依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)等7个阶段。
mvn clean install依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install等8个阶段。
mvn clean deploy依次执行了clean、resources、compile、testResources、testCompile、test、jar(打包)、install、deploy等9个阶段。
主要区别:
package命令完成了项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。
install命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库。
deploy命令完成了项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库。

面试题

1.Maven 如何引入jar包,流程是什么样子的?
主要分为三种方法。
这里以Junit为例
法1:利用dependency 本地jar包

<dependency>
    <groupId>com.jouypub</groupId>  <!--自定义-->
    <artifactId>cloud</artifactId>    <!--自定义-->
    <version>1.0</version> <!--自定义-->
    <scope>system</scope> <!--system,类似provided,需要显式提供依赖的jar以后,Maven就不会在Repository中查找它-->
    <systemPath>${basedir}/lib/cloud.jar</systemPath> <!--项目根目录下的lib文件夹下,也可以是本机其它目录的绝对路径-->
</dependency>

法二:引用外部lib
注意写Junit测试的时候 注意依赖写法:

<dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.13.1</version> //需要用4.12以上才可以Junit
      <scope>compile</scope> //注意不是test 需要使用compile 
    </dependency>

在这里插入图片描述
法三:
将外部jar打入本地maven仓库
cmd 进入jar包所在路径,执行以下命令

mvn install:install-file -Dfile=cloud.jar -DgroupId=com.hope.cloud -DartifactId=cloud -Dversion=1.0 -Dpackaging=jar

引入依赖:

<dependency>
    <groupId>com.hope.cloud</groupId>
    <artifactId>cloud</artifactId>
    <version>1.0</version>
</dependency>

2.Maven里面的包冲突应该怎么解决?

依赖冲突是指项目依赖的某一个jar包,有多个不同的版本,因而造成了包版本冲突.

A -> C -> X(1.0)
B -> D -> X(2.0)

相同jar不同版本,根据依赖的路径长短来决定引入哪个依赖。
两大原则:
1路径最近者优先
相同jar不同版本,根据依赖的路径长短来决定引入哪个依赖。

依赖链路一:A -> B -> C -> X(1.0)
依赖链路二:F -> D -> X(2.0)  (选中)

2第一声明者优先
在依赖路径长度相等的前提下,在POM中依赖声明的顺序决定了谁会被解析使用**,顺序最前的那个依赖优胜。**该例中,如果A的依赖声明在C之前,那么Y (1.0)就会被解析使用.

3Maven仓库的优先级? (前面知识点已讲述流程)
本地仓库 > ***(profile)> 远程仓库(repository)
镜像依赖于远程仓库/中央仓库,因此可以视作远程仓库的一部分。

4Maven 常用命令?

maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下。
-D 指定参数,如 -Dmaven.test.skip=true 跳过单元测试;
-P 指定 Profile 配置,可以用于区分环境;
-e 显示maven运行出错的信息;
-o 离线执行命令,即不去远程仓库更新包;
-X 显示maven允许的debug信息;
-U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次。

最重要的几个:
创建maven项目:mvn archetype:create
指定 group: -DgroupId=packageName
指定 artifact:-DartifactId=projectName
创建web项目:-DarchetypeArtifactId=maven-archetype-webapp
maven 打包:mvn package
编译源代码: mvn compile
编译测试代码:mvn test-compile
清理maven项目:mvn clean (注意是target清理)
启动tomcat:mvn tomcat:run
启动jetty:mvn jetty:run
运行打包部署:mvn tomcat:deploy
撤销部署:mvn tomcat:undeploy
启动web应用:mvn tomcat:start
停止web应用:mvn tomcat:stop
重新部署:mvn tomcat:redeploy


5关于scope依赖范围 ?
compile:默认的scope,运行期有效,需要打入包中。
provided:编译期有效,运行期不需要提供,不会打入包中。
runtime:编译不需要,在运行期有效,需要导入包中。(接口与实现分离)
test:测试需要,不会打入包中。
system:表示需要显式指定依赖的路径。非本地仓库引入、存在系统的某个路径下的jar。(一般不使用)

6 说一说Maven 各元素标签的含义

        元素名称                             简   介
      <project>                         POM的xml根元素
      <parent>                          声明继承
      <modules>                         声明聚合
      <groupId>                         坐标元素之一
      <artifactId>                      坐标元素之一
      <version>                         坐标元素之一
      <packaging>                       坐标元素之一,默认值jar
      <name>                            名称
      <description>                     描述
      <organization>                    所属组织
      <licenses><license>               许可证
      <mailingLists><mailingList>       邮件列表
      <developers><developer>           开发者
      <contributors><contributor>       贡献者
      <issueManagement>                 问题追踪系统
      <ciManagement>                    持续集成系统
      <scm>                             版本控制系统
      <prerequisites><maven>            要求Maven最低版本,默认值为2.0
      <build><sourceDirectory>          主源码目录
      <build><scriptSourceDirectory>    脚本源码目录
      <build><testSourceDirectory>      测试源码目录
      <build><outputDirectory>          主源码输出目录
      <build><testOutputDirectory>      测试源码输出目录
      <build><resources><resource>      主资源目录
      <build><testResources><testResource> 测试资源目录
      <build><finalName>                输出主构件的名称
      <build><directory>                输出目录
      <build><filters><filter>          通过properties文件定义资源过滤属性
      <build><extensions><extension>    扩展Maven的核心
      <build><pluginManagement>         插件管理
      <build><plugins><plugin>          插件
      <profiles><profile>               POM Profile
      <distributionManagement><repository>  发布版本部署仓库       
      <distributionManagement> <snapshotRepository> 快照版本部署仓库       
      <distributionManagement> <site>   站点部署
      <repositories><repository>        仓库
      <pluginRepositories><pluginRepository>   插件仓库
      <dependencies><dependency>        依赖                      
      <dependencyManagement>            依赖管理
      <properties>                      Maven属性
      <reporting><plugins>              报告插件

7 说一下Maven settings 配置情况:

1<settings>,settings.xml文档的根元素
2<localRepository>,本地仓库
3<interactiveMode>,Maven是否与用户交互,默认值true
4<offline>,离线模式,默认值false
5<pluginGroups>  <pluginGroup>,插件组
6<servers>  <server>,下载与部署仓库的认证信息
7<mirrors>  <mirror>,仓库镜像
8<proxies>  <proxy>,代理
9<profiles>  <profile>,Settings Profile
10<activeProfiles>  <activeProfile>,激活Profile

文章来源:https://blog.csdn.net/QAZJOU/article/details/135342661
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。