Obtendo programas Java iniciar sem chamar com Java

3

Seria útil poder iniciar programas Java apenas chamando o arquivo de classe do terminal (e fazer com que ele execute o terminal quando clicado duas vezes na GUI, mas isso é menos importante). Até agora só me ajudei com a seguinte correção ad hoc:

alias cs='java charstat.Charstat'

O Linux reconhece os arquivos como Java:

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

Então, há uma maneira de ter a ligação conectada? Ubuntu 16.04 aqui, mas respostas gerais bem-vindas.

Fim da pergunta, a seção de solução de problemas é iniciada.

UPDATE

Até agora, a linha de ação mais promissora é a proposta por Gilles. Então eu corri:

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

Agora,

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

Mas,

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

Isso foi feito no Ubuntu 14.04. Tem:

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

que eu acho que não foi instalado automaticamente em 16.04 se isso importa.

Ontem, depois do comentário de Mark Plotnick, lutei com este guia , sem sucesso. Ele introduziu um wrapper em /usr/local/bin/javawrapper , que a solução de Gilles não contém. Isso é para o Arch Linux.

UPDATE 2 (Ubuntu 16.06)

Em 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

E

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

ATUALIZAÇÃO 3

Após 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

Para o registro:

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

2 respostas

3

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), ...

    
por 01.08.2016 / 02:11
2

Você pode definir um item de mensagem de correio para ".class" e persuadir seu navegador (ou o lançador de área de trabalho) a usar isso.

No entanto, isso seria apenas mudar o qual programa que você executou para iniciar a execução (nenhuma economia real). O mesmo acontece com os lançadores de área de trabalho.

Leitura adicional:

por 31.07.2016 / 21:59