Maven系列第10篇:设计你自己的maven插件【高手必备】

整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。

Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动运行打包好的构件。各种好玩的东西只要你能想到,都可以通过maven插件去完成,不过我们需要先了解如何自定义maven插件。

必备知识

  1. Maven系列第6篇:生命周期和插件详解,高手必备!

本篇环境

  1. jdk1.8

  2. maven3.6.2

  3. idea

本章内容

  1. 自定义插件详细步骤

  2. 自定义插件参数的使用

  3. 自定义插件前缀的使用

  4. 手动实现打包之后自动运行的插件

自定义插件详细步骤

maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:

org.apache.maven.plugin.Mojo

接口有3个方法:

void execute() throws MojoExecutionException, MojoFailureException;

void setLog( Log log );

Log getLog();

  • execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法。

  • setLog:注入一个标准的Maven日志记录器,允许这个Mojo向用户传递事件和反馈

  • getLog:获取注入的日志记录器

说一下上面这个Log,这是一日志接口,里面定义了很多方法,主要用户向交互者输出日志,比如我们运行mvn clean,会输出很多提示信息,这些输出的信息就是通过Log来输出的。

Mojo接口有个默认的抽象类:

org.apache.maven.plugin.AbstractMojo

这个类中把Mojo接口中的setLoggetLog实现了,而execute方法没有实现,交给继承者去实现,这个类中Log默认可以向控制台输出日志信息,maven中自带的插件都继承这个类,一般情况下我们开发插件目标可以直接继承这个类,然后实现execute方法就可以了。

实现一个插件的具体步骤
1、 创建一个maven构件,这个构件的packaging比较特殊,必须为maven-plugin,表示这个构件是一个插件类型,如下:

pom.xml中的packageing元素必须如下值:

maven-plugin

2、导入maven插件依赖:

org.apache.maven

maven-plugin-api

3.0

org.apache.maven.plugin-tools

maven-plugin-annotations

3.4

provided

3、创建一个目标类,需要继承org.apache.maven.plugin.AbstractMojo
4、目标类中添加注解@Mojo注解:

@org.apache.maven.plugins.annotations.Mojo(name=“目标名称”)

注意@Mojo注解用来标注这个类是一个目标类,maven对插件进行构建的时候会根据这个注解来找到这个插件的目标,这个注解中还有其他参数,后面在详细介绍。

5、在目标类的execute方法中实现具体的逻辑
6、安装插件到本地仓库:插件的pom.xml所在目录执行下面命令

mvn clean install

或者可以部署到私服仓库,部署方式和其他构件的方式一样,这个具体去看前面文章的私服的文章。

7、让使用者去使用插件
案例1

下面我们来实现我们第一个插件,插件构件信息:

com.javacode2018

demo1-maven-plugin

1.0-SNAPSHOT

maven-plugin

创建一个目标类demo1,调用这个目标的时候,希望他能够输出:

hello my first maven plugin!

创建一个maven项目

打开idea,点击File->New->Project,如下图:

选择Maven,如下图:

点击上图中的Next,如下图,输入项目坐标信息:

点击上图中的Next,如下图,输入Project namemaven-chat10

点击上图中的Finish,完成创建,如下图:

配置一下idea的maven环境,点击File->Settings,如下图:

删除下面2个无用的文件夹:

创建插件模块`demo1-maven-plugin`

这次用idea创建一个插件模块demo1-maven-plugin,具体过程如下。

在刚才的maven-chat10项目窗口中,点击File->Project Structure,如下图:

也可以使用快捷键Ctrl+Alt+Shift+S打开

选择上图找你的Modules,如下图:

点击+,如下图:

选择上图中的New Module,如下图:

选择上图左侧的Maven,如下图:

点击上图中的Next,如下图:

Add as module to设置为maven-chat10,如下图:

上图中输入坐标信息,如下图:

点击上图中的Next,默认如下图:

修改上图中Module namedemo1-maven-plugin,如下图:

点击上图的Finish,如下图:

点击上图中的OK按钮,完成创建工作,目前项目结构如下图:

设置demo1-maven-plugin/pom.xml中packaging的值为maven-plugin,如下

maven-plugin

demo1-maven-plugin/pom.xml引入插件需要的依赖

org.apache.maven

maven-plugin-api

3.0

org.apache.maven.plugin-tools

maven-plugin-annotations

3.4

provided

最后demo1-maven-plugin/pom.xml内容如下

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

com.javacode2018

demo1-maven-plugin

1.0-SNAPSHOT

maven-plugin

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

org.apache.maven

maven-plugin-api

3.0

org.apache.maven.plugin-tools

maven-plugin-annotations

3.4

provided

org.apache.maven.plugins

maven-plugin-plugin

3.4

创建目标类

demo-maven-plugin中创建的目标类com.javacode2018.Demo1Mojo,需要继承org.apache.maven.plugin.AbstractMojo,需要实现@Mojo注解,如下:

package com.javacode2018;

import org.apache.maven.plugin.AbstractMojo;

import org.apache.maven.plugin.MojoExecutionException;

import org.apache.maven.plugin.MojoFailureException;

import org.apache.maven.plugins.annotations.Mojo;

/**

* 工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:路人甲Java

*/

@Mojo(name = “demo1”)

public class Demo1Mojo extends AbstractMojo {

public void execute() throws MojoExecutionException, MojoFailureException {

}

}

注意上面注解@Mojo(name = "demo1")name使用来标注目标的名称为demo1

实现目标类的execute方法

我们在execute方法中输出一句话

this.getLog().info(“hello my first maven plugin!”);

目前execute方法代码如下:

public void execute() throws MojoExecutionException, MojoFailureException {

this.getLog().info(“hello my first maven plugin!”);

}

安装插件到本地仓库

maven-chat10/pom.xml目录执行下面命令:

mvn clean install -pl :demo1-maven-plugin

注意上面命令和在demo1-maven-plugin/pom中执行mvn clean install效果是一样的,只是这个地方使用了maven裁剪的功能,对这块命令不熟悉的可以看:Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!

上面命令效果如下:

D:\code\IdeaProjects\maven-chat10>mvn clean install -pl :demo1-maven-plugin

[INFO] Scanning for projects…

[INFO]

[INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------

[INFO] Building demo1-maven-plugin 1.0-SNAPSHOT

[INFO] ----------------------------[ maven-plugin ]----------------------------

[INFO]

[INFO] — maven-clean-plugin:2.5:clean (default-clean) @ demo1-maven-plugin —

[INFO] Deleting D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target

[INFO]

[INFO] — maven-resources-plugin:2.6:resources (default-resources) @ demo1-maven-plugin —

[INFO] Using ‘UTF-8’ encoding to copy filtered resources.

[INFO] Copying 0 resource

[INFO]

[INFO] — maven-compiler-plugin:3.1:compile (default-compile) @ demo1-maven-plugin —

[INFO] Changes detected - recompiling the module!

[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\classes

[INFO]

[INFO] — maven-plugin-plugin:3.4:descriptor (default-descriptor) @ demo1-maven-plugin —

[INFO] Using ‘UTF-8’ encoding to read mojo metadata.

[INFO] Mojo extractor with id: java-javadoc found 0 mojo descriptors.

[INFO] Mojo extractor with id: java-annotations found 1 mojo descriptors.

[INFO]

[INFO] — maven-resources-plugin:2.6:testResources (default-testResources) @ demo1-maven-plugin —

[INFO] Using ‘UTF-8’ encoding to copy filtered resources.

[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\src\test\resources

[INFO]

[INFO] — maven-compiler-plugin:3.1:testCompile (default-testCompile) @ demo1-maven-plugin —

[INFO] Nothing to compile - all classes are up to date

[INFO]

[INFO] — maven-surefire-plugin:2.12.4:test (default-test) @ demo1-maven-plugin —

[INFO] No tests to run.

[INFO]

[INFO] — maven-jar-plugin:2.4:jar (default-jar) @ demo1-maven-plugin —

[INFO] Building jar: D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\demo1-maven-plugin-1.0-SNAPSHOT.jar

[INFO]

[INFO] — maven-plugin-plugin:3.4:addPluginArtifactMetadata (default-addPluginArtifactMetadata) @ demo1-maven-plugin —

[INFO]

[INFO] — maven-install-plugin:2.4:install (default-install) @ demo1-maven-plugin —

[INFO] Installing D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\demo1-maven-plugin-1.0-SNAPSHOT.jar to C:\Users\Think.m2\repository\com\javacode2018\demo1-maven-plugin\1.0-SNAPSHOT\demo1-maven-plugin-1.0-SNAPSHOT.jar

[INFO] Installing D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\pom.xml to C:\Users\Think.m2\repository\com\javacode2018\demo1-maven-plugin\1.0-SNAPSHOT\demo1-maven-plugin-1.0-SNAPSHOT.pom

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  5.402 s

[INFO] Finished at: 2019-11-26T15:21:26+08:00

[INFO] ------------------------------------------------------------------------

验证插件,调用插件的demo1目标看效果

maven-chat10/pom.xml所在目录执行:

mvn com.javacode2018:demo1-maven-plugin:demo1

效果如下:

D:\code\IdeaProjects\maven-chat10>mvn com.javacode2018:demo1-maven-plugin:demo1

[INFO] Scanning for projects…

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Build Order:

[INFO]

[INFO] demo1-maven-plugin                                        [maven-plugin]

[INFO] maven-chat10                                                       [pom]

[INFO]

[INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------

[INFO] Building demo1-maven-plugin 1.0-SNAPSHOT                           [1/2]

[INFO] ----------------------------[ maven-plugin ]----------------------------

[INFO]

[INFO] — demo1-maven-plugin:1.0-SNAPSHOT:demo1 (default-cli) @ demo1-maven-plugin —

[INFO] hello my first maven plugin!

[INFO]

[INFO] -------------------< com.javacode2018:maven-chat10 >--------------------

[INFO] Building maven-chat10 1.0-SNAPSHOT                                 [2/2]

[INFO] --------------------------------[ pom ]---------------------------------

[INFO]

[INFO] — demo1-maven-plugin:1.0-SNAPSHOT:demo1 (default-cli) @ maven-chat10 —

[INFO] hello my first maven plugin!

[INFO] ------------------------------------------------------------------------

[INFO] Reactor Summary for maven-chat10 1.0-SNAPSHOT:

[INFO]

[INFO] demo1-maven-plugin … SUCCESS [  0.358 s]

[INFO] maven-chat10 … SUCCESS [  0.042 s]

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  0.656 s

[INFO] Finished at: 2019-11-26T13:49:30+08:00

上面输出的东西比较多,我们主要看一下有这样的一句输出,如下:

[INFO] hello my first maven plugin!

上面这个输出就是我们在execute方法中输出的内容。

目标中参数的使用

上面我们介绍了开发一个插件目标详细的实现过程,然后写了一个简单的案例,比较简单。不过自定义的Mojo如果没有参数,那么这个Mojo基本上也实现不了什么复杂的功能,下面我们来看一下Mojo中如何使用参数。

需要先在mojo中定义参数

定义参数就像在mojo中创建一个实例变量并添加适当的注释一样简单。下面列出了一个简单mojo的参数示例:

/**

* 要显示的问候语。

*/

@Parameter( property = “sayhi.greeting”, defaultValue = “Hello World!” )

private String greeting;

@Parameter注解之前的部分是参数的描述,这个注解将变量标识为mojo参数。注解的defaultValue参数定义变量的默认值,此值maven的属性值,例如“${project.version}”(更多信息可以看上一篇文章中的 target=“_blank”>maven属性部分),property参数可用于通过引用用户通过-D选项设置的系统属性,即通过从命令行配置mojo参数,如mvn ... -Dsayhi.greeting=路人甲Java可以将路人甲Java的值传递给greeting参数,这个注解还有几个属性大家有兴趣的可以自己去研究一下。

在pom.xml配置参数的值

com.javacode2018

demo1-maven-plugin

1.0-SNAPSHOT

欢迎您和【路人甲Java】一起学习Maven技术!

上面设置的是一个string类型的greeting参数的值,还有其他很多类型定义以及使用,我们也来看一下。

Boolean参数

/**

* My boolean.

*/

@Parameter

private boolean myBoolean;

true

数字类型参数

数字类型包含:byte, Byte, int, Integer, long, Long, short, Short,读取配置时,XML文件中的文本将使用适当类的integer.parseInt()或valueOf()方法转换为整数值,这意味着字符串必须是有效的十进制整数值,仅由数字0到9组成,前面有一个可选的-表示负值。例子:

/**

* My Integer.

*/

@Parameter

private Integer myInteger;

10

File类型参数

读取配置时,XML文件中的文本用作所需文件或目录的路径。如果路径是相对的(不是以/或C:之类的驱动器号开头),则路径是相对于包含POM的目录的。例子:

/**

* My File.

*/

@Parameter

private File myFile;

c:\temp

枚举类型参数

public enum Color {

GREEN,

RED,

BLUE

}

/**

* My Enum

*/

@Parameter

private Color myColor;

GREEN

数组类型参数

/**

* My Array.

*/

@Parameter

private String[] myArray;

value1 value2
Collections类型参数

/**

* My List.

*/

@Parameter

private List myList;

value1 value2
Maps类型参数

/**

* My Map.

*/

@Parameter

private Map myMap;

value1

value2

Properties类型参数

java.util.Properties的类型

/**

* My Properties.

*/

@Parameter

private Properties myProperties;

propertyName1

propertyValue1

propertyName2

propertyValue2

自定义类型参数

/**

* My Object.

*/

@Parameter

private MyObject myObject;

test

案例2
修改案例代码

我们将上面各种类型的参数都放到Demo1Mojo中,Demo1Mojo类如下:

package com.javacode2018;

import org.apache.maven.plugin.AbstractMojo;

import org.apache.maven.plugin.MojoExecutionException;

import org.apache.maven.plugin.MojoFailureException;

import org.apache.maven.plugins.annotations.Mojo;

import org.apache.maven.plugins.annotations.Parameter;

import java.io.File;

import java.lang.reflect.Field;

import java.util.Arrays;

import java.util.List;

import java.util.Map;

import java.util.Properties;

/**

* 工作10年的前阿里P7分享Java、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:路人甲Java

*/

@Mojo(name = “demo1”)

public class Demo1Mojo extends AbstractMojo {

/**

* 要显示的问候语。

*/

@Parameter(property = “sayhi.greeting”, defaultValue = “Hello World!”)

private String greeting;

/**

* My boolean.

*/

@Parameter

private boolean myBoolean;

/**

* My Integer.

*/

@Parameter

private Integer myInteger;

/**

* My File.

*/

@Parameter

private File myFile;

public enum Color {

GREEN,

RED,

BLUE

}

/**

* My Enum

*/

@Parameter

private Color myColor;

/**

* My Array.

*/

@Parameter

private String[] myArray;

/**

* My List.

*/

@Parameter

private List myList;

/**

* My Map.

*/

@Parameter

private Map myMap;

/**

* My Properties.

*/

@Parameter

private Properties myProperties;

public static class Person {

private String name;

private int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public String toString() {

return “Person{” +

“name='” + name + ‘’’ +

“, age=” + age +

‘}’;

}

}

@Parameter

private Person person;

public void execute() throws MojoExecutionException, MojoFailureException {

this.getLog().info(“hello my first maven plugin!”);

Field[] declaredFields = Demo1Mojo.class.getDeclaredFields();

Arrays.stream(declaredFields).forEach(f -> {

if (f.isAccessible()) {

f.setAccessible(true);

}

try {

this.getLog().info(f.getName() + “:” + f.get(this));

} catch (IllegalAccessException e) {

this.getLog().warn(e);

}

});

}

}

将`demo1-maven-plugin`安装到本地仓库

maven-chat10/pom.xml所在目录运行:

mvn clean install -pl :demo1-maven-plugin

创建测试模块`demo1-maven-plugin-test`

使用idea创建,过程和demo1-maven-plugin过程类似,可以直接参考,创建好了,如下:

修改demo1-mavein-plugin-test/pom.xml文件,加入下面内容:

com.javacode2018

demo1-maven-plugin

1.0-SNAPSHOT

demo1 plugin test

pre-clean

demo1

true

30

${project.basedir}

BLUE

maven

spring

mybatis

springboot

springcloud

30

35

路人甲Java

30

name

javacode2018

age

30

路人甲Java

32

上面是将生命周期的pre-clean阶段绑定插件demo1-maven-plugindemo1目标,并且设置了demo1目标所需要的所有参数的值。

验证效果

maven-chat10/pom.xml所在目录执行:

D:\code\IdeaProjects\maven-chat10>mvn pre-clean -pl :demo1-maven-plugin-test -Dsayhi.greeting=“欢迎和【路人甲Java】一起学习Maven!”

[INFO] Scanning for projects…

[INFO]

[INFO] --------------< com.javacode2018:demo1-maven-plugin-test >--------------

[INFO] Building demo1-maven-plugin-test 1.0-SNAPSHOT

[INFO] --------------------------------[ jar ]---------------------------------

[INFO]

[INFO] — demo1-maven-plugin:1.0-SNAPSHOT:demo1 (demo1 plugin test) @ demo1-maven-plugin-test —

[INFO] hello my first maven plugin!

[INFO] greeting:欢迎和【路人甲Java】一起学习Maven!

[INFO] myBoolean:true

[INFO] myInteger:30

[INFO] myFile:D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-test

[INFO] myColor:BLUE

[INFO] myArray:[Ljava.lang.String;@7bf9b098

[INFO] myList:[30, 35]

[INFO] myMap:{age=30, name=路人甲Java}

[INFO] myProperties:{age=30, name=javacode2018}

[INFO] person:Person{name=‘路人甲Java’, age=32}

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  0.517 s

[INFO] Finished at: 2019-11-26T15:42:53+08:00

[INFO] ------------------------------------------------------------------------

插件前缀

在案例1中,我们使用下面命令调用的插件:

mvn com.javacode2018:demo1-maven-plugin:demo1

这种是采用下面这种格式:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
ame=javacode2018}

[INFO] person:Person{name=‘路人甲Java’, age=32}

[INFO] ------------------------------------------------------------------------

[INFO] BUILD SUCCESS

[INFO] ------------------------------------------------------------------------

[INFO] Total time:  0.517 s

[INFO] Finished at: 2019-11-26T15:42:53+08:00

[INFO] ------------------------------------------------------------------------

插件前缀

在案例1中,我们使用下面命令调用的插件:

mvn com.javacode2018:demo1-maven-plugin:demo1

这种是采用下面这种格式:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-o4YcuwEZ-1713224379230)]

[外链图片转存中…(img-esx9GC1z-1713224379231)]

[外链图片转存中…(img-Wm55h2fP-1713224379231)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。

这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。

大家可以把Java基础,JVM,并发编程,MySQL,Redis,Spring,Spring cloud等等做一个知识总结以及延伸,再去进行操作,不然光记是学不会的,这里我也提供一些脑图分享给大家:

[外链图片转存中…(img-toPXKJNi-1713224379231)]

[外链图片转存中…(img-wmv12trj-1713224379232)]

[外链图片转存中…(img-QU9Xt4F8-1713224379232)]

希望你看完这篇文章后,不要犹豫,抓紧学习,复习知识,准备在明年的金三银四拿到心仪的offer,加油,打工人!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值