学习笔记——解决一切Java问题的能力

结论

Java 世界里的一切东西都只是在拼 Java 命令行参数而已

比如,你运行的 IDEA 中一段简单的代码,可以复制 console 的参数出来运行,发现结果一样:

1
"C:\Program Files\Java\jdk1.8.0_121\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=3086:C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_121\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar;D:\OneDrive\02-coding\02-Java\demo\RabbitMQ\out\production\RabbitMQ" Dog

再比如,看看 mvn 这个命令到底执行了什么?

1
2
3
4
# 查看 mvn 的路径
which mvn
# 获得 mvn 路径,比如 /c/Program Files/apache-maven-3.5.2/bin/mvn,可以看到执行的具体命令
bash -x /c/Program Files/apache-maven-3.5.2/bin/mvn

可以看到,最后输出了这样一段:

1
exec /c/ProgramData/Oracle/Java/javapath/java -classpath '/c/Program Files/apache-maven-3.5.2-bin/apache-maven-3.5.2/boot/plexus-classworlds-2.5.2.jar' '-Dclassworlds.conf=/c/Program Files/apache-maven-3.5.2-bin/apache-maven-3.5.2/bin/m2.conf' '-Dmaven.home=/c/Program Files/apache-maven-3.5.2-bin/apache-maven-3.5.2' '-Dlibrary.jansi.path=/c/Program Files/apache-maven-3.5.2-bin/apache-maven-3.5.2/lib/jansi-native' '-Dmaven.multiModuleProjectDirectory=/c/Program Files/apache-maven-3.5.2-bin/apache-maven-3.5.2/bin' org.codehaus.plexus.classworlds.launcher.Launcher

调试一切 Java 程序

  • 想清楚要调试的代码跑在那个 JVM 里
  • 找到要调试的源代码

搜索关键词 java debug parameters 获得debug的命令行参数 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044

运行如下调试命令:

1
2
3
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044 Main
# 输出如下内容
Listening for transport dt_socket at address: 1044

等待 1044 的调试器连接过来,默认是 5005 端口:

  • suspend 可以为 y 或 n,要是线上运行的话,就不要设置为 y 了,否则会阻塞;
  • 1044 指端口

一旦启动如下环境变量之后,启动任何java程序,都会加上这个调试的参数:

1
2
3
4
5
# 设置环境变量
export JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
# 运行需要调试的命令
mvn compile
# unset JAVA_TOOL_OPTIONS`
  • 在需要调试的代码的地方加上断点
  • 然后在 IDEA 的 configuration 中添加一个 remote 配置,连接到 1044 端口
  • 接着就可以在 IDEA 中运行 debug 调试了

总结

看视频的过程中,UP 主阅读源码的过程中说到了设计模式的看法,有时候设计模式你一开始不一定会用,但是要能从命名上一眼能知道类是干嘛用的!这就好比是行业的「黑话」一样~

参考

Michael翔 wechat
欢迎订阅 ヾノ≧∀≦)o
我知道是不会有人点的,但万一有人想不开呢👇