关于Maven,这几个一定要会的知识点,你真的了解吗?(1)

执行maven打包命令

mvn package

image

运行生成的jar,结果与原始方式无区别

image.png

四、POM结构

image

五、Maven流程

1. maven的理想

maven像一种什么设计模式?答案:模板方法模式

自动走完标准的构建流程:清理->编译->测试->报告->打包->部署

统一入口,所有配置在一个pom里搞定

2. maven的约定

image.png

约定的目录(不可改):

image.png

3. maven的生命周期 maven的构建生命周期,只是一个抽象的规范流程。周期内的每个阶段的具体执行,是在插件里面来实现的。

image

各个生命周期预设的定义如下:

image

运行任何一个阶段,都会从其所在生命周期的第一个阶段开始,顺序执行到指定的阶段,如:

mvn package(本义:执行default周期的package阶段,maven会自动从process-resources阶段开始运行到package阶段结束)

4. maven的插件

插件plugin是绑定到生命周期,承担实际功能的组件。mvn运行时,自动关联插件来运行

下图是maven默认的各阶段对应的插件列表:

image

六、常用Maven命令

  • mvn clean 清理

  • mvn compile 编译主程序

  • mvn package 打包

  • mvn install 安装jar到本地库

使用maven命令生成项目(idea和eclipse生成项目最终也是依赖maven插件生成的):

mvn archetype:generate -DgroupId=enjoy -DartifactId=simple -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=1.0

mvn archetype:generate -DgroupId=enjoy -DartifactId=simple-web -DarchetypeArtifactId=maven-archetype-webapp -Dversion=1.0

七、Maven插件开发

可以自定义插件,来扩展maven的功能。插件的开发步骤如下:

1. 引入maven api依赖

image

2. 编写简单Mojo类(继承AbstractMojo)

image.png

3. 执行插件

mvn com.enjoy:enjoy-plugin:1.0:log

image.png

4. 关联插件到生命周期来执行

image

构建项目对应的生命周期

image.png

八、Maven坐标与依赖

1. 坐标

--------在数学中, 任何一个坐标可以唯一确定一个“点”

Maven 中坐标是Jar包的唯一标识

坐标元素包括groupId、artifactId、version、packaging:

image

2. 依赖

依赖即:A->B,B->C,C->D这种项目间的依存关系。

在java的jvm内,依赖的最终表现是,项目A启动时,其依赖的jar包必须都对应放入其classpath路径内。

3. 依赖传递

image.png

上述过程中,项目Mall归结起来,依赖的fastjson会有三个版本。

而我们的jvm最终肯定只能接受一个版本的jar,所以必须有所取舍。

maven默认的取舍规则是:

1、路径最短原则:product和customer里的fastjson引用路径较短,路径为两步;pay项目里的fastjson引用路径较长,路径为三步。因此pay中的fastjson被淘汰;

2、同路径长度下,谁先声明谁优先:product和customer中的fastjson路径相同,那么就看在pom中是先声明product还是先声明customer,谁先用谁的。

4. 依赖冲突及解决

在依赖传递里,我们看到,maven根据自己的规则为我们取舍出了一个版本的jar,但此jar版本选择可能会与我们的项目预期不符:

例如:我们最终想的版本是fastjson:1.2.30版本(但它在第一步即被淘汰掉了)

当出现此类情况时,我们项目运行可能会出错(项目中使用到了1.2.30版本的特性),此问题即是我们常遇到的jar包冲突问题。

补救方式:使用exclusions将product和customer中的fastjson包排除掉,用法如下图:

image.png

当发生jar冲突程序报错时,可以使用mvn命令查出项目最终依赖的jar包树,看版本是否是我们预期的:

命令:mvn dependency:tree

image

5. 依赖范围scope

mvn在运行时,生命周期的不同阶段,会有不同的依赖范围,一般有以下依赖范围scope:

  • compile:默认范围,用于编译(依赖的jar在打包时会包含进去)

  • provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath(依赖的jar在打包时不会包含进去)

  • runtime:在执行时需要使用(依赖的jar在打包时会包含进去)

  • test:用于test任务时使用(依赖的jar在打包时不会包含进去)

  • system:需要外在提供相应的元素。通过systemPath来取得(一般禁止使用)

每个scope实际上是配置了一个不同的classpath,jvm根据选择不同的classpath来达到依赖不同

image.png

九、环境激活-profiles使用

在springmvc项目中,开发/测试/线上三个不同环境,配置文件往往也不同。

打包时需要对配置文件做出选择(maven提供了profiles机制供我们使用)。

1. profiles的场景

[图片上传失败…(image-d072b5-1606207243473)]

这个选择,实际发生在default生命周期的resource阶段(maven-resources-plugin执行过程里)

2. 定义profiles

为了指导插件将对应的resource文件打入classpath里,先定出profiles

image

此定义即指,当mvn命令执行时,我们需要通过 -P dev或者-P test方式传入我们的意图:

dev/test选择,会导致properties里的变量值含义不同,我们主要关注package.environment变量

3. 资源插件的配置指定

image

配置maven-resources-plugin插件执行时,要复制的目录资源

4. mvn约定的资源中需要过滤掉环境目录

image

需要将mvn约定的资源目录里,过滤掉环境目录

5. 小属性更轻便的用法

对于简单的属性,我们可以选择更轻便的用法

① 直接在环境中定义属性值

image

② 项目属性文件配置

image

③ 约定的资源启用替换过滤

image

最后有对pom.xml里面各标签有疑惑的小伙伴,下面附上pom.xml文件标签的详细注释解释,可以花时间好好去看一下对应的标签的作用是什么。

xxx

xxx

xxx

xxx

4.0.0

xxx

xxx

jar

1.0-SNAPSHOT

xxx-maven

http://maven.apache.org

A maven project to study maven.

jira

http://jira.baidu.com/banseon




Demo

banseon@126.com

banseon@126.com

banseon@126.com

http:/hi.baidu.com/banseon/demo/dev/

HELLO WORLD

banseon

banseon@126.com

Project Manager Architect

demo

http://hi.baidu.com/xxx

No

-5

Project Manager Architect

No Apache 2

http://www.baidu.com/banseon/LICENSE-2.0.txt

repo

A business-friendly OSS license

scm:svn:http://svn.baidu.com/banseon/maven/banseon/banseon-maven2-trunk(dao-trunk) scm:svn:http://svn.baidu.com/banseon/maven/banseon/dao-trunk

http://svn.baidu.com/banseon

demo

http://www.baidu.com/banseon



true/false

true/false



true/false




true/false

true/false



true/false




true/false

jdk版本,如:1.7

Windows XP

Windows

x86

5.1.2600

mavenVersion

2.0.3

/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/

总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友

三面蚂蚁金服成功拿到offer后,他说他累了

三面蚂蚁金服成功拿到offer后,他说他累了

ersion>

mavenVersion

2.0.3

/usr/local/hudson/hudson-home/jobs/maven-guide-zh-to-production/workspace/

总结

总的来说,面试是有套路的,一面基础,二面架构,三面个人。

最后,小编这里收集整理了一些资料,其中包括面试题(含答案)、书籍、视频等。希望也能帮助想进大厂的朋友

[外链图片转存中…(img-P6gJFVpv-1714582164126)]

[外链图片转存中…(img-F8Bfe53i-1714582164127)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值