Maven是Java 项目必备,Maven 主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。项目构建工具 、更好的管理依赖
目录
- Maven安装与运行
- maven 重要知识点
- 面试题
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