在Windows上从Java进程启动时,设置环境变量的Ruby脚本失败并显示无效参数 - ruby​​_setenv(Errno :: EINVAL)

时间:2013-07-22 14:00:27

标签: java ruby eclipse environment-variables processbuilder

我有一个非常简单的ruby脚本,如下所示:

puts "Running test program"
ENV["TEST"] = "foo"
puts ENV["TEST"]

当我从命令行运行此脚本时,它按预期工作:

C:\Temp\rb-test>ruby foo.rb
Running test program
foo

我需要做的是从Java程序启动此脚本。 Java程序如下所示:

Path path = FileSystems.getDefault().getPath("c:", "temp", "rb-test");
ProcessBuilder pb = new ProcessBuilder("ruby.exe", "foo.rb").directory(path.toFile()).redirectErrorStream(true);
Process process = pb.start();
process.waitFor();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = bufferedReader.readLine();
while (line != null) {
    System.out.println(line);
    line = bufferedReader.readLine();
}

当我从Eclipse运行Java程序时,我得到以下输出:

foo.rb:2:in `[]=': Invalid argument - ruby_setenv (Errno::EINVAL)
    from foo.rb:2:in `<main>'
Running test program

实际上我从第三方产品(Vagrant)调用一个更大的Ruby脚本,为什么不能更改Ruby脚本。

为什么会这样?我可以通过某种方式修改我的Java代码来解决它吗?

Ruby版本:ruby 1.9.3p0 (2011-10-30) [i386-mingw32]

更新:如果我从cmd窗口运行它,java代码实际上有效。当我在Eclipse中运行它时,它不起作用。不幸的是,由于我正在开发一个我们将在Eclipse中运行的工具,因此这无济于事。

更新2:如果我从Eclipse启动cmd窗口,当我从此cmd窗口中运行ruby脚本时,我会遇到同样的问题。这让我相信存在某种许可问题。但是,我看不到从开始菜单开始的cmd和通过Eclipse启动的cmd之间的任何权限差异。两者都作为同一个用户运行,我可以看到的所有安全属性都是相同的。

更新3:尝试了最新版本的Ruby(2.0.0p247 (2013-06-27) [i386-mingw32])。同样的行为。

2 个答案:

答案 0 :(得分:1)

问题在于,当我从Eclipse启动Ruby脚本时,我有一个不同的环境。具体来说,我有一个看起来很奇怪的CLASSPATH环境变量。我认为这是CLASSPATH变量的大小。在传递给我的子流程之前真的很久了,但是在子流程中它被截断并且看起来很糟糕。

我怀疑我遇到了Windows环境块最大大小的问题(详见此处:http://blogs.msdn.com/b/oldnewthing/archive/2010/02/03/9957320.aspx)。我不会进一步研究这个问题,但已修复我的代码以在启动进程之前删除CLASSPATH变量。

Path path = FileSystems.getDefault().getPath("c:", "temp", "rb-test");
ProcessBuilder pb = new ProcessBuilder("ruby.exe","foo.rb").directory(path.toFile()).redirectErrorStream(true);
pb.environment().remove("CLASSPATH");
Process process = pb.start();
process.waitFor();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = bufferedReader.readLine();
while (line != null) {
    System.out.println(line);
    line = bufferedReader.readLine();
}

答案 1 :(得分:1)

作为Wocker安装的一部分,有类似的问题在运行vagrant:

http://wckr.github.io/

问题是我的系统环境PATH太长了。我从它上面掏出了一堆残骸,并且流浪者(基于红宝石)跑得很好。