用 JAVA 撸一遍 JVM 01: 命令行工具
第一章先通过main方法模拟cmd 输出一些相关信息
jcommander
引入依赖
<!-- 命令行参数解析器 --> <dependency> <groupId>com.beust</groupId> <artifactId>jcommander</artifactId> <version>1.72</version> </dependency>
Cmd
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<String> mainClassAndArgs; boolean ok; String getMainClass() { return mainClassAndArgs != null && !mainClassAndArgs.isEmpty() ? mainClassAndArgs.get(0) : null; } List<String> 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: <main class> [-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:%s ", cmd.classpath, cmd.getMainClass(), cmd.getAppArgs()); } }
报错了,挺懵逼的
人麻了 这里方法用错了,上面顺手打了个addCommand() 但还是有点问题 还是不太行 先跳过
我又跳回来了, 少了一些调试配置
idea上面的run , 这里加上参数-version, 原本是提示program arguments 然后就可以了
下一篇:
python和c++学哪个比较好