不能 运行 exe 文件使用 ProcessBuilder 取决于计算机

Can't run exe file using ProcessBuilder depending of computer

我在 Java 中使用 Process 和 ProcessBuilder 时遇到问题。

我有一行代码如下所示:

Process process = new ProcessBuilder("des.exe", String... params);

它在我的个人电脑上运行良好,但在我的测试服务器上运行不正常,我不明白为什么。

ErrorStream 给我这个:

des.exe: MZ����@���: not found 
des.exe: Syntax error: "(" unexpected

两台计算机都在 Ubuntu 16.04.4 LTS 和 java 1.8.

知道它可能来自哪里吗?

造成差异的最可能原因是windows可执行文件的文件格式没有在内核中的binfmt_misc处理程序中注册,这使得内核可以透明地通过帮助程序执行各种程序.错误 Syntax error: "(" unexpected 通常意味着文件已移交给 /bin/sh,而不是 wine。

因此,检查 binfmt_misc 文件系统是否已挂载(大多数现代 linux 会自动执行此操作):

grep binfmt_misc /proc/self/mountinfo

应该 return 一些条目(可能是 autofs,可能 binfmt_misc 取决于发行版)。

如果没有则安装它:

sudo mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc

看这个目录的内容就知道注册了什么。要使用 wine 注册 运行 dos 可执行文件,您需要注册它:

echo ':DOSWin:M::MZ::/usr/bin/wine:' | sudo tee /proc/sys/fs/binfmt_misc/register

注册后,二进制文件的执行应该是透明的,并且应该通过 ProcessBuilder 成功。

在启动时为服务器配置此项留给用户作为练习。

如果你想跳过这整个混乱,那么你可以将执行从 des.exe 更改为 wine,第一个参数为 des.exe