Linux
O Ubuntu já faz isso por um jar. Com o pacote openjdk-8-jre (e versões anteriores), executar um jar invoca jexec
nele. Isso não é feito para uma classe, talvez porque seja raro uma classe ser um executável autônomo em vez de uma biblioteca (então, novamente, esse também é o caso dos jars).
Você pode configurar o mesmo mecanismo subjacente para lidar com classes. Esse mecanismo é o recurso Linux binfmt_misc , que permite ao kernel executar arquivos arbitrários através de um programa auxiliar.
Como a linha de comando do Java é realmente estranha, você precisa passar por um wrapper para converter o nome do arquivo em algo que o comando java
seja capaz de executar. Salve este script como /usr/local/bin/javarun
e torne-o executável:
#!/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
O seguinte comando deve ser o truque para as classes. Consulte o link e o documentação do kernel para explicações.
echo ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:" | sudo tee /proc/sys/fs/binfmt_misc/register
Execute esta vez para ativá-lo. Para remover uma configuração, execute sudo rm /proc/sys/fs/binfmt_misc/java-class
. Quando estiver satisfeito com a configuração, adicione o seguinte comando a /etc/rc.local
:
echo >/proc/sys/fs/binfmt_misc/register ":java-class:M:0:\xca\xfe\xba\xbe::/usr/local/bin/javarun:"
Zsh
Se você usar o zsh como seu shell, poderá fazê-lo executar arquivos com base em sua extensão, definindo um < um alias de sufixo
alias -s class=javarun
Você precisa do mesmo script javarun
acima. É claro que isso só funciona em zsh, não em bash, gerenciadores de arquivos, scripts (exceto em scripts zsh onde este comando foi executado), ...