Java Can';t根据计算机的不同,使用ProcessBuilder运行exe文件

Java Can';t根据计算机的不同,使用ProcessBuilder运行exe文件,java,processbuilder,Java,Processbuilder,我在Java中使用Process和ProcessBuilder时遇到了一个问题 我有一行代码如下所示: Process process = new ProcessBuilder("des.exe", String... params); 它可以在我的个人电脑上正常工作,但在我的测试服务器上不行,我不知道为什么 错误流给我这个: des.exe: MZ����@���: not found des.exe: Syntax error: "(" unexpected 这两台计算机都在Ubunt

我在Java中使用Process和
ProcessBuilder
时遇到了一个问题

我有一行代码如下所示:

Process process = new ProcessBuilder("des.exe", String... params);
它可以在我的个人电脑上正常工作,但在我的测试服务器上不行,我不知道为什么

错误流给我这个:

des.exe: MZ����@���: not found 
des.exe: Syntax error: "(" unexpected
这两台计算机都在Ubuntu16.04.4LTS和Java1.8上


知道它可能来自哪里吗?

造成这种差异的最可能原因是windows可执行文件的文件格式没有注册到内核中的处理程序,这使得内核可以通过助手透明地执行各种程序。错误
语法错误:“(“意外的
通常意味着文件被传递到
/bin/sh
,而不是wine

因此,请检查是否安装了binfmt_misc文件系统(大多数现代Linux会自动执行此操作):

应该返回一些条目(可能是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
的第一个参数将执行从
des.exe
更改为
wine
,您是否尝试过手动在服务器上执行程序?ProcessBuilder似乎没有问题,只是des.exe在服务器上不工作。我使用了ng wine,它工作得很好,您是否也在使用wine执行Java?不,我使用mavenWell在两台计算机上运行了测试,我不知道为什么它在一台计算机上工作,但在服务器上,我怀疑它没有将其识别为有效的可执行文件,或者至少没有使用wine启动它。请尝试
wine des.exe
。就是这样。wine没有注册艾德,我不知道为什么。现在很好用。非常感谢!
echo ':DOSWin:M::MZ::/usr/bin/wine:' | sudo tee /proc/sys/fs/binfmt_misc/register