无需使用 Java 调用即可启动 Java 程序

无需使用 Java 调用即可启动 Java 程序

如果能够通过从终端调用类文件来启动 Java 程序(并在 GUI 中双击时在终端上运行它,但这不太重要),那会很方便。到目前为止,我只帮助自己进行以下临时修复:

alias cs='java charstat.Charstat'

Linux 将这些文件识别为 Java:

 charstat/Charstat.class: compiled Java class data, version 52.0 (Java 1.8)

那么有没有办法让呼叫硬连线呢? Ubuntu 16.04 这里,但欢迎一般答案。


问题结束,故障排除部分开始。


更新

迄今为止,最有希望的行动路线是吉尔斯提出的。所以我跑了:

echo ":java-class:M:0:cafebabe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register

现在,

tomasz@tomasz-Latitude-E4200:~/Desktop$ cat /proc/sys/fs/binfmt_misc/java-class
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic 6361666562616265

但,

tomasz@tomasz-Latitude-E4200:~/Desktop$ ./Void.class 
bash: ./Void.class: cannot execute binary file: Exec format error

这是在 Ubuntu 14.04 上完成的。它有:

binfmt-support/trusty,now 2.1.4-1 amd64 [installed,automatic]
  Support for extra binary formats

如果重要的话,我认为 16.04 上不会自动安装它。

昨天,根据马克·普洛特尼克的评论,我与本指南,无济于事。它在 处引入了一个包装器/usr/local/bin/javawrapper,而 Gilles 的解决方案不包含该包装器。但这是针对 Arch Linux 的。

更新2(Ubuntu 16.06)

16.06 日:

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ cat /proc/sys/fs/binfmt_misc/Java 
enabled
interpreter /usr/local/bin/javawrapper
flags: 
offset 0
magic cafebabe

和,

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Nain.class 
bash: ./Nain.class: No such file or directory

更新3

echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/bin/java:" | sudo tee /proc/sys/fs/binfmt_misc/register

tomasz@tomasz-Latitude-E4200:~/Desktop/io$ java Main 
Please input the file location and name.
^Ctomasz@tomasz-Latitude-E4200:~/Desktop/io$ ./Main.class 
Error: Could not find or load main class ..Main.class

作为记录:

tomasz@tomasz-Latitude-E4200:/proc/sys/fs/binfmt_misc$ cat java-class 
enabled
interpreter /usr/bin/java
flags: 
offset 0
magic cafebabe

答案1

Linux

Ubuntu 已经为 jar 做到了这一点。随着openjdk-8-jre 包(以及更早的版本),在其上执行 jar 调用jexec。这不是为类完成的,可能是因为类很少是独立的可执行文件而不是库(话又说回来,jar 也是如此)。

您可以配置相同的底层机制来处理类。这个机制就是Linuxbinfmt_misc功能,它允许内核通过帮助程序执行任意文件。

因为Java的命令行确实很奇怪,所以你需要通过一个包装器将文件名转换成java命令能够执行的东西。将此脚本保存为/usr/local/bin/javarun并使其可执行:

#!/bin/sh
case "$1" in
  */*) dir="${1%/*}"; base="${1##*/}";;
  *) dir="."; base="$1";;
esac
shift
case "$base" in
  [!-]*.class) base="${base%.*}";;
  *) echo >&2 "Usage: $0 FILENAME.class [ARGS...]"; exit 127;;
esac
case "$CLASSPATH" in
  "") exec java -cp "$dir" "$base" "$@";;
  *) exec java -cp "$dir:$CLASSPATH" "$base" "$@";;
esac

以下命令应该适用于类。请参阅https://unix.stackexchange.com/a/21651内核文档 以获得解释。

echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:" | sudo tee /proc/sys/fs/binfmt_misc/register

运行一次即可启用它。要删除设置,请运行sudo rm /proc/sys/fs/binfmt_misc/java-class.对设置感到满意后,将以下命令添加到/etc/rc.local

echo >/proc/sys/fs/binfmt_misc/register ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:"

兹什

如果你使用桀骜作为你的 shell,你可以让它根据文件的扩展名执行文件,方法是定义一个后缀别名

alias -s class=javarun

您需要javarun与上面相同的脚本。当然,这只适用于 zsh,不适用于 bash、文件管理器、脚本(运行此命令的 zsh 脚本除外),...

答案2

您可以为“.class”定义一个mailcap项目,并说服您的浏览器(或桌面启动器)使用它。

然而,这只是改变哪个您运行以开始执行的程序(没有真正的节省)。桌面启动器也是如此。

进一步阅读:

相关内容