java命令行解析工具
完成一个命令行工具,该命令行工具解析java的命令行
知识背景:
java命令总共有四类格式:
java [-options] class [args]
java [-options] -jar jarfile [args]
javaw [-options] class [args]
javaw [-options] -jar jarfile [args]
主要传递三种参数:选项、主类名(或者JAR文件名)以及main()方法参数。
选项由减号(-)开头,第一个非选项名给出了主类的完全限定名。
如果给出了-jar选项,则第一个非选项参数表示JAR文件名,java命令必须从这个JAR文件中寻找主类。
javaw和java命令唯一的区别在于,javaw显示命令行窗口后不会堵塞,会继续执行接下来的命令。
java命令行的选项可以分为两种:标准选项和非标准选项。标准选项比较稳定,不会轻易变动,非标准的选项以-X开头。非标准选项中有一部分是高级选项,以-XX开头。
选项 | 用法 |
---|---|
-version | 输出版本信息,然后退出 |
-?/-help | 输出帮助信息,然后退出 |
-cp / -classpath | 指定用户类路径 |
-Dproperty=value | 设置Java系统属性 |
-Xms | 设置初始堆空间大小 |
-Xmx | 设置最大堆空间大小 |
-Xss | 设置线程栈空间大小 |
go语言的os包中定义了一个Args变量,用来存放传递给命令行的全部参数。Go语言又内置了flag包,帮助我们处理命令行选项。具体处理代码如下所示:
package main
import (
"flag"
"fmt"
"os"
)
type Cmd struct {
helpFlag bool
versionFlag bool
cpOption string
class string
args []string
}
func parseCmd() *Cmd {
cmd := &Cmd{}
// Usage被赋值函数,当在parse flag出现错误时,会调用Usage函数
flag.Usage = printUsage
// BoolVar方法用来获取命令行中-help选项后面的值,默认是false
flag.BoolVar(&cmd.helpFlag, "help", false, "print help message")
flag.BoolVar(&cmd.helpFlag, "?", false, "print help message")
flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit")
flag.StringVar(&cmd.cpOption, "classpath", "", "classpath")
flag.StringVar(&cmd.cpOption, "cp", "", "classpath")
// Parse方法根据命令行参数列表vars,解析命令行
flag.Parse()
// 在Parse方法成功执行之后,使用Args方法返回参数列表
// 其中第一个参数是主类名
args := flag.Args()
if len(args) > 0 {
cmd.class = args[0]
cmd.args = args[1:]
}
return cmd
}
func printUsage() {
fmt.Printf("Usage: %s [-options] class [args...]\n", os.Args[0])
}
更多测试代码详见此代码仓