Java 世界里的一切东西都只是在拼 Java 命令行参数而已
比如,你运行的 IDEA 中一段简单的代码,可以复制 console 的参数出来运行,发现结果一样:
"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
这个命令到底执行了什么?
# 查看 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
可以看到,最后输出了这样一段:
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 debug parameters
获得debug的命令行参数 -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044
运行如下调试命令:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044 Main # 输出如下内容 Listening for transport dt_socket at address: 1044
等待 1044 的调试器连接过来,默认是 5005 端口:
suspend
一旦启动如下环境变量之后,启动任何java程序,都会加上这个调试的参数:
# 设置环境变量 export JAVA_TOOL_OPTIONS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044 # 运行需要调试的命令 mvn compile # unset JAVA_TOOL_OPTIONS`