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 或多个插件目标相绑定,如果没和任何插件目标相绑定,则该构建阶段将不会被执行(别忘了有的构建阶段会有默认的插件目标绑定),但如果和多个目标相绑定,则会执行所有这些目标。
具体执行顺序的例子如下:
mvn clean dependency:copy-dependencies package
clean
和 package
参数是构建阶段,而 dependency:copy-dependencies
是 dependency
插件的一个目标。
所以运行时的顺序是:
先执行 clean lifecycle 的 clean
及 clean
之前的阶段,然后执行 dependency:copy-dependencies
,最后执行 default lifecycle 的 package
及 package
之前的阶段。
以带有连字符单词命名( 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 阶段进行了绑定。