如果能够通过从终端调用类文件来启动 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项目,并说服您的浏览器(或桌面启动器)使用它。
然而,这只是改变哪个您运行以开始执行的程序(没有真正的节省)。桌面启动器也是如此。
进一步阅读: