一、命令行工具
一、准备工作
1、安装JDK
https://blog.csdn.net/sinat_36403828/article/details/78045618
2、安装go语言环境
https://blog.csdn.net/dgh_84/article/details/54973908
并配置工作空间,通过GOPATH环境变量配置D:\Program_Files\go (自己依情况设定)
3、创建目录结构
我们将在这里编写,D:\Program_Files\go\src\jvmgo下 就是在 %GOPATH%/src/jvmgo
二、java命令
请参看:https://www.cnblogs.com/princessd8251/articles/4025140.html
https://blog.csdn.net/yang889999888/article/details/72823261
三、编写命令行工具
1、先定义一个结构体表示命令行选项和参数
在jvmgo文件夹下定义cmd.go文件,在其中定义Cmd结构体 1 package main
2 3 import "flag" 4 import "fmt" 5 import "os" 6 7 // java [-options] class [args...] 8 type Cmd struct { 9 helpFlag bool 10 versionFlag bool 11 cpOption string 12 class string 13 args []string 14 } 15 //对命令的执行 16 func parseCmd() *Cmd { 17 cmd := &Cmd{}//初始化Cmd结构体 18 19 flag.Usage = printUsage//解析失败时调用的函数printUsage
20 flag.BoolVar(&cmd.helpFlag, "help", false, "print help message") 21 flag.BoolVar(&cmd.helpFlag, "?", false, "print help message") 22 flag.BoolVar(&cmd.versionFlag, "version", false, "print version and exit") 23 flag.StringVar(&cmd.cpOption, "classpath", "", "classpath") 24 flag.StringVar(&cmd.cpOption, "cp", "", "classpath") 25 flag.Parse() 26 27 args := flag.Args()//获取参数数组 28 if len(args) > 0 { 29 cmd.class = args[0] 30 cmd.args = args[1:] 31 } 32 33 return cmd 34 } 35 36 func printUsage() { 37 fmt.Printf("Usage: %s [-options] class [args...]\n", os.Args[0]) 38 //flag.PrintDefaults() 39 }
上面定义了cmd.go,使用到了flag包,首先将printUsage函数赋值给flag.Usage变量,再根据各种Var()函数设置需要解析的选项,然后使用Parse()函数解析选项,如果解析失败就掉用printUsage()把用法打印到控制台,如果解析成功,调用flag.Args()捕获其他没有解析的参数。其中第一个参数就是主类名,剩下是要传递的参数。
四、测试
在jvmgo下创建main.go文件
1 package main 2 3 import "fmt" 4 5 func main() { 6 cmd := parseCmd() 7 8 if cmd.versionFlag { 9 fmt.Println("version 0.0.1") 10 } else if cmd.helpFlag || cmd.class == "" { 11 printUsage() 12 } else { 13 startJVM(cmd) 14 } 15 } 16 17 func startJVM(cmd *Cmd) { 18 fmt.Printf("classpath:%s class:%s args:%v\n", 19 cmd.cpOption, cmd.class, cmd.args) 20 }
main()函数先调用ParseCommand()函数解析命令行参数,若正常,调用startJVM()函数启动JVM虚拟机,如果解析错误,或输入-help选项,调用printUsage()函数打印帮助信息,若输入-version选项,则输出版本信息。
startJVM()函数并没有执行.class文件的功能
在%GOPATH%\src\下打开cmd,执行下面命令
go install jvmgo
然后在%GOPATH%\bin下找到jvmgo.exe文件,进行测试
PS D:\Program_Files\go\bin> .\jvmgo.exe Usage: D:\Program_Files\go\bin\jvmgo.exe [-options] class [args...] PS D:\Program_Files\go\bin> .\jvmgo.exe -help Usage: D:\Program_Files\go\bin\jvmgo.exe [-options] class [args...] PS D:\Program_Files\go\bin> .\jvmgo.exe -version version 0.0.1 PS D:\Program_Files\go\bin> .\jvmgo.exe -cp hyp/喵喵喵 myAPP arg1 arg2 arg3 classpath:hyp/喵喵喵 class:myAPP args:[arg1 arg2 arg3]