如果你帮助我,我真的很感激。我正在用Java改写一个简单的Minecraft启动器。一切都很好,除了一件事。 我有一个使用os.Exec执行此命令的启动函数:
java -Xincgc -Xmx1024M -Djava.library.path="/minecraft/bin/natives/" -cp "/minecraft/bin/*" -Dfml.ignoreInvalidMinecraftCertificates=true -Dfml.ignorePatchDiscrepancies=true net.minecraft.launchwrapper.Launch --username user --session session --version 1.6.4 --gameDir "/minecraft" --assetsDir "/minecraft" --tweakClass cpw.mods.fml.common.launcher.FMLTweaker
通过bash或cmd运行这一切很好,但是当使用Go函数执行时,它会返回以下内容:
Could not find or load main class net.minecraft.launchwrapper.Launch
我认为os.exec(Command)无法正确插入这部分命令:
-cp "/minecraft/bin/*"
也许是因为我用strconv.Quote()函数或者星号引用了字符串“/ minecraft / bin / *”。我真的不知道什么是heppening。啊,顺便说一下,os.exec运行的命令是正确的(虽然我在stdout中用fmt读取它以进行调试)。
程序:
func start(login string, session string, ram string) {
//start game
app := "java"
arg0 := "-Xincgc"
arg1 := "-Xmx" + ram + "M"
arg2 := "-Djava.library.path=" + strconv.Quote(filepath.FromSlash(client+"bin/natives/"))
arg3 := "-cp"
arg4 := strconv.Quote(filepath.FromSlash(client + "bin/*"))
arg5 := "-Dfml.ignoreInvalidMinecraftCertificates=true"
arg6 := "-Dfml.ignorePatchDiscrepancies=true"
arg7 := "net.minecraft.launchwrapper.Launch"
arg8 := "--username"
//arg9 is login
arg10 := "--session"
//arg11 is session
arg12 := "--version 1.6.4"
arg13 := "--gameDir"
arg14 := strconv.Quote(filepath.FromSlash(client))
arg15 := "--assetsDir"
arg16 := strconv.Quote(filepath.FromSlash(client + "assets"))
arg17 := "--tweakClass cpw.mods.fml.common.launcher.FMLTweaker"
cmd := exec.Command(app, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, login, arg10, session, arg12, arg13, arg14, arg15, arg16, arg17)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()
fmt.Println(app, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, login, arg10, session, arg12, arg13, arg14, arg15, arg16, arg17)
}
答案 0 :(得分:1)
问题“Properly pass arguments to Go Exec”提及:
如果参数中有空格,
exec.Command(...)
会为参数添加双引号,因此您只需要在需要的位置转义\"
。
在您的情况下,-cp "/minecraft/bin/*"
将作为两个单独的参数传递给exec.Command
。
如果您需要在一个参数中使用引号,则可以使用string literal来保留它们(如“How do you add spaces to exec.command in golang”中所述)。
但是,如果在您的情况下,您需要shell(如double quotes escaping in golang exec中所述)cp
(类路径),则删除引号:
exec.Command(..., "-cp", `/minecraft/bin/*`, ...)