• 一、命令行工具


    一、准备工作

    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_Filesgo    (自己依情况设定)

    3、创建目录结构

    我们将在这里编写,D:Program_Filesgosrcjvmgo下 就是在 %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...] ", 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
    ",
    19         cmd.cpOption, cmd.class, cmd.args)
    20 }

    main()函数先调用ParseCommand()函数解析命令行参数,若正常,调用startJVM()函数启动JVM虚拟机,如果解析错误,或输入-help选项,调用printUsage()函数打印帮助信息,若输入-version选项,则输出版本信息。

    startJVM()函数并没有执行.class文件的功能

    在%GOPATH%src下打开cmd,执行下面命令

    go install jvmgo

    然后在%GOPATH%in下找到jvmgo.exe文件,进行测试

    PS D:Program_Filesgoin> .jvmgo.exe
    Usage: D:Program_Filesgoinjvmgo.exe [-options] class [args...]
    PS D:Program_Filesgoin> .jvmgo.exe -help
    Usage: D:Program_Filesgoinjvmgo.exe [-options] class [args...]
    PS D:Program_Filesgoin> .jvmgo.exe -version
    version 0.0.1
    PS D:Program_Filesgoin> .jvmgo.exe -cp hyp/喵喵喵 myAPP arg1 arg2 arg3
    classpath:hyp/喵喵喵 class:myAPP args:[arg1 arg2 arg3]
  • 相关阅读:
    MUI(5)
    MUI(4)
    MUI(3)
    如何查找僵尸进程并Kill之,杀不掉的要查看父进程并杀之
    Linux下查看文件和文件夹大小
    CentOS,Ubuntu,Gentoo,Freebsd,RedHat,Debian的区别及选择
    eclipse4.3 安装tomcat8
    maven 代理
    ldap基本命令
    ssh-keygen
  • 原文地址:https://www.cnblogs.com/pingxin/p/p00080.html
Copyright © 2020-2023  润新知