13

次のようなGoogleGoプログラムからJVMを起動しようとしています。

package main
import "fmt"
import "os"
import "log"
func main() {

var name string
name="\\jrex64\\bin\\java.exe"

var path="-Xbootclasspath:jrex64\\lib\\rt.jar;"+
"jrex64\\lib\\jfxrt.jar;"+
"jrex64\\lib\\resources.jar;"+
"jrex64\\lib\\ext\\sunjce_provider.jar;"+
"jrex64\\lib\\ext\\zipfs.jar;"+
"jrex64\\lib\\ext\\sunmscapi.jar;"+
"jrex64\\lib\\ext\\sunec.jar;"+
"jrex64\\lib\\ext\\dnsns.jar;"+
"jrex64\\lib\\ext\\access-bridge-64.jar;"+
"jrex64\\lib\\security\\local_policy.jar;"+
"jrex64\\lib\\jce.jar;"+
"jrex64\\lib\\jfr.jar;"+
"jrex64\\lib\\jsse.jar;"+
"jrex64\\lib\\charsets.jar;"+
"jrex64\\lib\\";



var args[] string=make([]string,4)
args[0]="-verbose"
args[1]=path;
args[2]="-cp Ganesha_lib\\*"
args[3]="-jar Ganesha.jar"

var attr* os.ProcAttr

proc,err:=os.StartProcess(name,args,attr)
proc.Wait();


if err!=nil {
    fmt.Println("an error occurred.\n")
    log.Fatal(err)
}

}

これは私の最初のGoプログラムです。そして、私は次のエラーが発生することに完全に圧倒されています:

パニック:ランタイムエラー:無効なメモリアドレスまたはnilポインタの逆参照[signal 0xc0000005 code = 0x0 addr = 0x0 pc = 0x4278b5] goroutine 1 [running]:os.startProcess(0x4aacb4、0x14、0xf840001eb0、0x500000005、0x0、...)C :/ Users / ADMINI〜1 / AppData / Local / Temp / 2 / bindist767862039 / go / src / pkg / os / exec_posix.go:28 + 0x152 os.StartProcess(0x4aacb4、0x14、0xf840001eb0、0x500000005、0x0、.. .. )C:/Users/ADMINI~1/AppData/Local/Temp/2/bindist767862039/go/src/pkg/os/doc.go:24 + 0x5c main.main()D:/MyGoProject/src/main.go :60 + 0x23c goroutine 2 [syscall]:runtime.mainによって作成されましたC:/Users/ADMINI~1/AppData/Local/Temp/2/bindist767862039/go/src/pkg/runtime/proc.c:221プロセスはで終了しました終了コード2

このエラーコードをどのように解釈する必要がありますか?何が悪かったのか?また、JVMスターテットを取得するにはどうすればよいですか?Go実行可能ファイルのサブディレクトリにあります。

4

4 に答える 4

18

通常、os.StartProcess を直接使用しないことをお勧めします。代わりに、はるかに簡単なインターフェースを持つ os/exec を使用してください。Java サブプロセスを開始し、それが完了するのを待つ方法を次に示します。

http://play.golang.org/p/APlp9KK9wx

package main

import (
    "fmt"
    "log"
    "os/exec"
    "strings"
)

func main() {
    var java = "\\jrex64\\bin\\java.exe"

    var path = []string{
        "jrex64\\lib\\rt.jar",
        "jrex64\\lib\\jfxrt.jar",
        "jrex64\\lib\\resources.jar",
        "jrex64\\lib\\ext\\sunjce_provider.jar",
        "jrex64\\lib\\ext\\zipfs.jar",
        "jrex64\\lib\\ext\\sunmscapi.jar",
        "jrex64\\lib\\ext\\sunec.jar",
        "jrex64\\lib\\ext\\dnsns.jar",
        "jrex64\\lib\\ext\\access-bridge-64.jar",
        "jrex64\\lib\\security\\local_policy.jar",
        "jrex64\\lib\\jce.jar",
        "jrex64\\lib\\jfr.jar",
        "jrex64\\lib\\jsse.jar",
        "jrex64\\lib\\charsets.jar",
        "jrex64\\lib\\",
    }

    pathflag := "-Xbootclasspath:" + strings.Join(path, ";")
    cmd := exec.Command(java, "-verbose", pathflag, "-cp Ganesha_lib\\*", "-jar Ganesha.jar")
    err := cmd.Run()

    if err != nil {
        fmt.Println("an error occurred.\n")
        log.Fatal(err)
    }

}

興味がある方のために説明すると、パニックになった理由は attr が nil ポインターだったからです。代わりに、できたはずattr := new(os.ProcAttr)です。

于 2012-12-17T16:42:37.863 に答える
2

ここ:

var attr* os.ProcAttr

proc, err := os.StartProcess(name, args, attr)

attr変数は nil であり、その中で逆参照されると、表示さos.StartProcessれるエラーが発生します。

于 2012-12-17T11:53:59.450 に答える
0

Windows では、os.ProcAttr を空のままにすることはできません。At Dir は空の文字列に設定し、Sys は &syscall.SysProcAttr{} に設定する必要があります。以下が機能するはずです。

name := "\\jrex64\\bin\\java.exe"
libs := "-Xbootclasspath:jrex64\\lib\\rt.jar;" +
    // add all libs
    "jrex64\\lib\\";
args := []string{"-verbose", libs, "-cp Ganesha_lib\\*", "-jar Ganesha.jar"}
attr := &os.ProcAttr{
    "",
    nil,
    []*os.File{os.Stdin, os.Stdout, os.Stderr},
    &syscall.SysProcAttr{}} //CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, } 
}

proc, err := os.StartProcess(name,args,attr);
if err != nil {
    log.Fatalf("start process: %v", err)
}
_, err = proc.Wait();
if err != nil {
    log.Fatalf("wait: %v", err)
}
于 2021-11-21T15:40:55.817 に答える