第一章先通过main方法模拟cmd 输出一些相关信息
jcommander引入依赖
Cmdcom.beust jcommander1.72
package com.linnine.jvm;
public class Cmd {
@Parameter(names = {"-?", "-help"}, description = "print help message", order = 3, help = true)
boolean helpFlag = false;
@Parameter(names = "-version", description = "pringt version and exit", order = 2)
boolean versionFlag = false;
@Parameter(names = {"-cp", "-classpath"}, description = "classpath", order = 1)
String classpath;
@Parameter(description = "main class and args")
List mainClassAndArgs;
boolean ok;
String getMainClass() {
return mainClassAndArgs != null && !mainClassAndArgs.isEmpty() ? mainClassAndArgs.get(0) : null;
}
List getAppArgs() {
return mainClassAndArgs != null && mainClassAndArgs.size() > 1 ? mainClassAndArgs.subList(1, mainClassAndArgs.size()) : null;
}
static Cmd parse(String[] argv) {
Cmd args = new Cmd();
JCommander cmd = JCommander.newBuilder().addCommand(args).build();
cmd.parse(argv);
args.ok = true;
return args;
}
}
main
package com.linnine.jvm;
public class Main {
public static void main(String[] args) {
Cmd cmd = Cmd.parse(args);
if(!cmd.ok || cmd.helpFlag){
System.out.println("Usage: [-options] class [args...]");
return;
}
if (cmd.versionFlag){
System.out.println("java version "1.8.0"");
return;
}
startJvm(cmd);
}
private static void startJvm(Cmd cmd) {
System.out.printf("classpath:%s class:%s args:%sn", cmd.classpath, cmd.getMainClass(), cmd.getAppArgs());
}
}
报错了,挺懵逼的
人麻了 这里方法用错了,上面顺手打了个addCommand()
但还是有点问题
还是不太行 先跳过
我又跳回来了, 少了一些调试配置
idea上面的run ,
这里加上参数-version, 原本是提示program arguments
然后就可以了



