1. IDEA

VSCode 用习惯了,所以对 IDEA 中对应的常用快捷键魔改一下:

  • new
    ctrl+enter
  • delete
    ctrl + shift + k
  • move statement down
    alt + down
  • move statement up
    alt + up
  • select previous tab
    ctrl + page up
  • select next tab
    ctrl + page down
  • forward
    alt + right
  • back
    alt + left
  • generate
    alt + G
  • reformat code
    shift + alt + F

IDEA 自带的快捷功能:

  • 高级搜索 Find In Path
    ctrl + shift + F
  • 快速生成 Generate
    alt + G
  • 优化 import 导入语句 Optimize imports
    ctrl + alt + O
  • 谁调用了这个方法 Call Hierarchy
    ctrl + alt + H
  • 查看所有的实现类 implementation
    ctrl + alt + B (ctrl + alt + click)
  • 文件大纲 File Structure
    ctrl + F12
  • 文件下一处错误 Next Highlighted Error
    F2
  • 高级重命名 Rename
    shift + F6
  • 调试器快捷键
    • step over 单步跳过 F5 执行一行
    • step into 单步进入 F6 执行一条语句
    • force step into 强制单步进入 F7
    • step out 单步跳出 F8

2. 调试器(debugger)

调试自身项目中的代码很简单,debugger 即可,但如何调试非项目的源代码呢?
比如调试 mvn compile 的运行过程,maven 本质上也是在后台启动一个 JVM 进行编译。

  • 拿到 maven 的源代码,搜索 maven compiler plugin github
  • 找个地方在自己某个项目的工作目录下通过 mvnDebug compile 在调试模式下运行 maven 的某个生命周期。此时 maven 启动 JVM 进行 compile 的同时,还会启动一个服务来监听默认的 8000 端口。
  • IDEA中打开maven-compiler-plugin这个插件的源代码,顶部导航栏中添加配置,选择 remote,填写刚才 mvnDebug 时所监听的端口 8000。
  • 此时如果当前运行的 maven 版本和 IDEA 中打开的相关 maven 源码版本相同,则大功告成,如何确认呢?maven 源码中打个断点,成功暂停即代表调试器连接成功。

以上过程中其实就是一个远端,一个本地端,服务端运行了相关 maven 脚本,而本地通过 HTTP 连接远端 JVM,从而实现远程调试 maven 源码。只不过本例中,远端其实也只是 localhost 本地启的服务而已。

3. Maven 生命周期与使用

官方文档地址

3.1 Build Lifecycle 基础

Maven 基于构建生命周期这一核心概念,有三个内置的 build lifecycles:default,clean 和 site。

build lifecycle 由 不同的 build phase 组成,一个 build phase 对应着 build lifecycle 的一个阶段, 其会依次执行。

build phase 由不同的 plugin goal 组成,通过声明 plugin goal 与 build phase 的绑定来具体的实现在生命周期中执行一些特定任务。

一个插件目标可以绑定到 0 或多个构建阶段上,如果不绑定到任何构建阶段上,也可以在生命周期之外单独调用执行;如果绑定到多个构建阶段上,那该插件目标会分别在这些阶段中被执行。
更进一步,一个构建阶段可以和 0 或多个插件目标相绑定,如果没和任何插件目标相绑定,则该构建阶段将不会被执行(别忘了有的构建阶段会有默认的插件目标绑定),但如果和多个目标相绑定,则会执行所有这些目标。
具体执行顺序的例子如下:

  1. mvn clean dependency:copy-dependencies package

cleanpackage 参数是构建阶段,而 dependency:copy-dependenciesdependency 插件的一个目标。
所以运行时的顺序是:
先执行 clean lifecycle 的 cleanclean 之前的阶段,然后执行 dependency:copy-dependencies ,最后执行 default lifecycle 的 packagepackage 之前的阶段。

以带有连字符单词命名( pre-*post-*process-* )的构建阶段通常并不直接从命令行中调用,而是在构建过程中内部调用,用于生成对外部来说没什么可用性的中间结果。

3.2 使用

在内建的生命周期中,有些构建阶段会和某些内置插件目标进行默认的绑定,具体有哪些绑定,取决于 <packaging> 值(默认 jar )。

所以使用方法一是设置 <packaging> 值,触发一些构建阶段的默认插件及其默认绑定。

二是在 pom.xml 文件中进行插件配置,一个插件可能会有多个目标,可以分别指定目标和想要绑定的阶段。

3.3 看图说话

运行 mvn clean verify 实际触发了两个内建的 build 生命周期:

  • clean 生命周期
  • default 生命周期(但只运行到 verify 阶段为止,而不是直到最后的 deploy)

一些内建的生命周期的构建阶段会和内置的 maven 插件的一些目标进行默认绑定,如 maven-clean-plugin:2.5 插件的 clean 目标和 default-clean 阶段进行了绑定。
image.png
image.png

image.pngimage.png
image.png