【问题标题】:Building Go from source fails tests when run using Java's Runtime.getRuntime().exec()使用 Java 的 Runtime.getRuntime().exec() 运行时,从源代码构建 Go 测试失败
【发布时间】:2016-11-30 19:09:03
【问题描述】:

这个问题和上一个问题有关,这里是:Java Runtime.getRuntime().exec() appears to be overwriting $PATH

我正在尝试从 Java 程序内部的源代码构建 Go。我可以使用终端正确构建它,但是 Java 的 Runtime.getRuntime().exec() 得到了有趣的结果。我尝试使用 ProcessBuilder,但无法正确制作 Go。将我当前的设置与 exec() 一起使用,它可以正常运行,但随后两次测试失败。代码sn-p:

String[] envp = new String[4];
envp[0] = "CC=/usr/bin/clang";
envp[1] = "GOROOT_BOOTSTRAP=/usr/local/go";
envp[2] = "CGO_ENABLED=0";
envp[3] = "PATH=" + System.getenv().get("PATH");
Runtime.getRuntime().exec("./all.bash", envp, "$HOME/Desktop/go/src");

它可以正常运行并正确编译,但是当它运行测试套件时,出现两个错误:

--- FAIL: TestCurrent (0.00s)
user_test.go:24: Current: user: Current not implemented on darwin/amd64 (got &user.User{Uid:"502", Gid:"20", Username:"", Name:"", HomeDir:""})
FAIL
FAIL    os/user 0.009s

还有一个更长的,由于长度荒谬,我不会在这里粘贴,但归结为:

panic: test timed out after 3m0s
...
FAIL    runtime 180.056s

我不知道为什么前者会失败,但是对于我从终端构建时的运行时,它说:

ok      runtime 19.096s

所以有些东西导致这花费了荒谬的时间。我做了一些谷歌搜索,听说如果我使用 ARM=5 作为环境变量,它可能会被修复,但这并没有改变任何东西。有谁知道为什么当我从 Java 而不是终端构建时这些测试会失败?

【问题讨论】:

  • 如果测试对您来说不是超级重要,您可以随时尝试运行make.bash
  • 要使User.Current() 工作,您需要启用您使用CGO_ENABLED=0 禁用的cgo。请参阅问题here
  • @ivan.sim 严格来说,它不是“不起作用”。它只是去信任一些环境变量的fallback 实现。
  • @captncraig 只有在他使用go 1.7+时才为真
  • 好收获。不过他有新的错误信息,所以我猜他在主人身上。

标签: java go environment-variables exec


【解决方案1】:

查看os/user 包的源代码,看起来native user handling 取决于启用cgo。如果 cgo=0 (您的情况),它将回退到 USERHOME 环境变量。

source code in question

尝试将USER=whatever 放入您的执行环境中。

恐怕我需要更多信息来诊断运行时问题。

【讨论】:

  • 我尝试添加环境变量 "envp[4] = "USER=whatever";"但得到了同样的错误,所以我尝试了 "envp[4] = "USER=";"和 "envp[4] = "HOME=/Users/";" (单独),但每次都得到相同的错误。我在这里做错了吗?
  • 如果你想要完整的运行时错误,它在pastebin.com/5XnGzysq
  • @user1914745 看起来您还需要将 HOME 设置为某个值。对不起。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多