
关于Maven,这几个一定要会的知识点,你真的了解吗?
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。第一个是算法关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本。
- Maven工程结构和内容定义在一个xml文件中(一般是pom.xml)
利用Maven构建项目过程阶段:
二、Maven安装配置
1. JDK安装
Maven是基于Java的工具,所以配置Maven要做的第一件事就是安装JDK
2. Windows安装
Maven下载地址:http://maven.apache.org/download.html
下载解压后,添加环境变量即完成
3. Linux安装
① 配置yum源
sudo yum install -y yum-utils # yum-config-manager --add-repo http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo
② 安装Maven
yum install -y apache-maven
完成安装后,通过mvn --version 检验安装版本
三、Maven初体验
Maven主要是用来打jar、war包以及管理jar包
1. 原始的javac打包方式
假如我们有一个Hello.java文件,想要将它打成可执行jar包,一般这样做。
使用 javac 命令和 jar 命令打包:
生成的jar包文件,由两部分组成,class文件和META-INF目录,如下:
此时的jar包,是不可直接运行的,需要指定入口main类
进入META-INF目录,编辑MANIFEST.MF文件,如下:
运行此jar包,得到运行结果:
2. maven打包
在pom文件内配置入口类
执行maven打包命令
mvn package
运行生成的jar,结果与原始方式无区别
四、POM结构
五、Maven流程
1. maven的理想
maven像一种什么设计模式?答案:模板方法模式
自动走完标准的构建流程:清理->编译->测试->报告->打包->部署
统一入口,所有配置在一个pom里搞定
2. maven的约定
约定的目录(不可改):
3. maven的生命周期 maven的构建生命周期,只是一个抽象的规范流程。周期内的每个阶段的具体执行,是在插件里面来实现的。
各个生命周期预设的定义如下:
运行任何一个阶段,都会从其所在生命周期的第一个阶段开始,顺序执行到指定的阶段,如:
mvn package(本义:执行default周期的package阶段,maven会自动从process-resources阶段开始运行到package阶段结束)
4. maven的插件
插件plugin是绑定到生命周期,承担实际功能的组件。mvn运行时,自动关联插件来运行
下图是maven默认的各阶段对应的插件列表:
六、常用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依赖
2. 编写简单Mojo类(继承AbstractMojo)
3. 执行插件
mvn com.enjoy:enjoy-plugin:1.0:log
4. 关联插件到生命周期来执行
构建项目对应的生命周期
八、Maven坐标与依赖
1. 坐标
--------在数学中, 任何一个坐标可以唯一确定一个“点”
Maven 中坐标是Jar包的唯一标识
坐标元素包括groupId、artifactId、version、packaging:
2. 依赖
依赖即:A->B,B->C,C->D这种项目间的依存关系。
在java的jvm内,依赖的最终表现是,项目A启动时,其依赖的jar包必须都对应放入其classpath路径内。
3. 依赖传递
上述过程中,项目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包排除掉,用法如下图:
当发生jar冲突程序报错时,可以使用mvn命令查出项目最终依赖的jar包树,看版本是否是我们预期的:
命令:mvn dependency:tree
5. 依赖范围scope
mvn在运行时,生命周期的不同阶段,会有不同的依赖范围,一般有以下依赖范围scope:
-
compile:默认范围,用于编译(依赖的jar在打包时会包含进去)
-
provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath(依赖的jar在打包时不会包含进去)
-
runtime:在执行时需要使用(依赖的jar在打包时会包含进去)
-
test:用于test任务时使用(依赖的jar在打包时不会包含进去)
-
system:需要外在提供相应的元素。通过systemPath来取得(一般禁止使用)
每个scope实际上是配置了一个不同的classpath,jvm根据选择不同的classpath来达到依赖不同
九、环境激活-profiles使用
在springmvc项目中,开发/测试/线上三个不同环境,配置文件往往也不同。
打包时需要对配置文件做出选择(maven提供了profiles机制供我们使用)。
1. profiles的场景
[图片上传失败…(image-d072b5-1606207243473)]
这个选择,实际发生在default生命周期的resource阶段(maven-resources-plugin执行过程里)
2. 定义profiles
为了指导插件将对应的resource文件打入classpath里,先定出profiles
此定义即指,当mvn命令执行时,我们需要通过 -P dev或者-P test方式传入我们的意图:
dev/test选择,会导致properties里的变量值含义不同,我们主要关注package.environment变量
3. 资源插件的配置指定
配置maven-resources-plugin插件执行时,要复制的目录资源
4. mvn约定的资源中需要过滤掉环境目录
需要将mvn约定的资源目录里,过滤掉环境目录
5. 小属性更轻便的用法
对于简单的属性,我们可以选择更轻便的用法
① 直接在环境中定义属性值
② 项目属性文件配置
③ 约定的资源启用替换过滤
最后有对pom.xml里面各标签有疑惑的小伙伴,下面附上pom.xml文件标签的详细注释解释,可以花时间好好去看一下对应的标签的作用是什么。
xxxxxx
xxx
xxx
4.0.0
xxx
xxx
jar
1.0-SNAPSHOT
xxx-maven
http://maven.apache.org
A maven project to study maven.
jirahttp://jira.baidu.com/banseon
banseon@126.com
banseon@126.com
banseon@126.com
http:/hi.baidu.com/banseon/demo/dev/
banseon
banseon@126.com
Project Manager Architectdemo
http://hi.baidu.com/xxx
No-5
http://www.baidu.com/banseon/LICENSE-2.0.txt
repo
A business-friendly OSS license
http://svn.baidu.com/banseon
http://www.baidu.com/banseon
true/false
true/false
true/false
true/false
true/false
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
《算法的乐趣》共有23个章节:
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
ependencies/dependency元素 -->
总结
三个工作日收到了offer,头条面试体验还是很棒的,这次的头条面试好像每面技术都问了我算法,然后就是中间件、MySQL、Redis、Kafka、网络等等。
- 第一个是算法
关于算法,我觉得最好的是刷题,作死的刷的,多做多练习,加上自己的理解,还是比较容易拿下的。
而且,我貌似是将《算法刷题LeetCode中文版》、《算法的乐趣》大概都过了一遍,尤其是这本
《算法刷题LeetCode中文版》总共有15个章节:编程技巧、线性表、字符串、栈和队列、树、排序、查找、暴力枚举法、广度优先搜索、深度优先搜索、分治法、贪心法、动态规划、图、细节实现题
[外链图片转存中…(img-D6BcxwyL-1720028983670)]
《算法的乐趣》共有23个章节:
[外链图片转存中…(img-fZYbCLDs-1720028983671)]
[外链图片转存中…(img-ekqSkzHp-1720028983671)]
- 第二个是Redis、MySQL、kafka(给大家看下我都有哪些复习笔记)
基本上都是面试真题解析、笔记和学习大纲图,感觉复习也就需要这些吧(个人意见)
[外链图片转存中…(img-caSDbH4n-1720028983672)]
- 第三个是网络(给大家看一本我之前得到的《JAVA核心知识整理》包括30个章节分类,这本283页的JAVA核心知识整理还是很不错的,一次性总结了30个分享的大知识点)
[外链图片转存中…(img-QoeUtvjW-1720028983672)]
更多推荐
所有评论(0)