Java Can';t根据计算机的不同,使用ProcessBuilder运行exe文件
我在Java中使用Process和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
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