一、命令行工具

一、准备工作

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]

 

posted @ 2018-08-13 16:27  平心  阅读(391)  评论(0编辑  收藏  举报