改变了什么来阻止Java程序通过权限位运行

我总是在我的Java程序上设置执行位,以便在不使用-jar参数的情况下将它们称为常规程序…只需在路径中运行名称为app的应用程序即可。

在过去,它只需要: chmod +x myjavaprogram.jar ,然后chmod +x myjavaprogram.jar运行它./myjavaprogram.jar

它仍适用于具有16.04之前的Ubuntu版本的计算机。 但是,它不适用于我的任何更新到16.04的计算机。

除了确保设置执行位的建议之外,我找不到任何对问题的引用,并且确保安装了这个引用: sudo apt install binfmt-support

我以前从未安装过该软件包,但为了解决这个问题,我运行了安装程序,确认它已经默认安装在Ubuntu上并且具有最新版本。

我发现运行java程序时遇到问题的唯一其他引用是正确安装Java的规范(openjdk或oracle)。 我已经安装了完整的更新。 我也使用过sudo update-alternatives --config java来改变两者之间的关系。 它们都在控制台上显示相同的错误。

这是我从两种方法得到的:

使用cli作为常规程序:

 $ ./HelloWorld.jar invalid file (bad magic number): Exec format error 

使用-jar参数:

 $ java -jar ./HelloWorld.jar Hello World 

我的/usr/local/bin文件夹中的许多Java应用程序都是在没有java扩展名的情况下重命名的。 它们仍然作为我的计算机上的常规程序,具有16.04之前的Ubuntu版本。

没有人知道如何将此function添加到版本16.04?

更新

双击文件浏览器中的应用程序。

但是,我运行了几十个java应用程序就像使用正常的命令行工具,如findtopgrepnetstat等。 一些命令调用exec路径中的其他java应用程序。

答案是使用binfmt-support服务注册所需的二进制文件。

研究我的16.04安装和我的14.04安装之间的区别,我发现在运行命令update-binfmts --display时,之前的Ubuntu版本有一个更大的列表。

该清单包括一个jarwrapper。

安装jarwrapper解决了这个问题:

 $ sudo apt install jarwrapper 

binfmt-support是一种服务,可配置为检测运行各种类型文件所需的内容,包括调用Wine来运行Windows exe文件。

可以通过研究update-binfmts手册页找到使用binfmt-support服务的详细信息。

好奇为什么删除默认支持。 但我很高兴能够手动将此支持恢复到我的计算机。

注意

顺便说一下,程序类型不是由扩展名决定的。 它由应用程序二进制头决定。 所以应用程序可以命名为任何东西,没有扩展名。