L. *_*mes 5 command-line java 16.04
我总是在我的 Java 程序上设置执行位,以便像常规程序一样调用它们,而不使用-jar参数……只需运行路径中带有名称的应用程序即可。
过去,它只需要: chmod +x myjavaprogram.jar,然后./myjavaprogram.jar从命令行运行它。
它仍然适用于我的 Ubuntu 版本早于 16.04 的计算机。但是,它不适用于我更新到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
Run Code Online (Sandbox Code Playgroud)
使用 -jar 参数:
$ java -jar ./HelloWorld.jar
Hello World
Run Code Online (Sandbox Code Playgroud)
我的/usr/local/bin文件夹中的许多 Java 应用程序都在没有 java 扩展名的情况下重命名。它们仍然可以作为我的计算机上的常规程序运行,该计算机的 Ubuntu 版本早于 16.04。
没有人知道如何将此功能添加到 16.04 版吗?
更新
双击文件浏览器中的应用程序有效。
不过,我有几万的Java应用程式的,我跑,就像使用普通的命令行工具,如,find,top,grep,netstat,等。一些命令调用 exec 路径中的其他 Java 应用程序。
答案是使用binfmt-support服务注册所需的二进制文件。
研究我的 16.04 安装和 14.04 安装之间的差异,我发现以前的 Ubuntu 版本在运行命令时有一个更大的列表update-binfmts --display。
该列表包括一个 jarwrapper。
安装jarwrapper解决了这个问题:
$ sudo apt install jarwrapper
Run Code Online (Sandbox Code Playgroud)
binfmt-support 是一项服务,可以配置为检测运行各种类型的文件所需的内容,包括调用Wine来运行 Windows exe 文件。
通过研究update-binfmts手册页可以找到使用 binfmt-support 服务的详细信息。
好奇为什么默认支持被放弃。但我很高兴能够手动恢复我的计算机的这种支持。
笔记
顺便说一下,程序类型不是由扩展名决定的。它由应用程序二进制头确定。因此应用程序可以命名为任何名称,无需扩展名。
| 归档时间: |
|
| 查看次数: |
1299 次 |
| 最近记录: |