O que mudou para impedir que programas Java sejam executados através do bit de permissão

5

Eu sempre configurei o bit de execução em meus programas Java para chamá-los como um programa regular sem usar o argumento -jar ... apenas executando o aplicativo com o nome no caminho.

No passado, levava apenas: chmod +x myjavaprogram.jar , depois executá-lo com ./myjavaprogram.jar da linha de comando.

Ainda funciona nos meus computadores que possuem a versão do Ubuntu anterior a 16.04. No entanto, não funciona em nenhum dos meus computadores atualizados para 16.04 .

Não consigo encontrar nenhuma referência ao problema, além de sugestões para garantir que o bit de execução esteja definido e algumas referências para garantir que isso seja instalado: sudo apt install binfmt-support

Eu nunca instalei o pacote antes, no entanto, em um esforço para corrigir o problema, executei o instalador que confirma que ele já está instalado no Ubuntu por padrão e tem a versão mais recente.

As únicas outras referências que estou encontrando com problemas na execução de programas java são as especificações de ter o Java instalado (openjdk ou oracle). Eu tenho ambos instalados com atualizações completas. Eu também usei sudo update-alternatives --config java para mudar entre os dois. Ambos mostram o mesmo erro no console.

Isso é o que recebo dos dois métodos:

Usando o CLI como um programa normal:

$ ./HelloWorld.jar
invalid file (bad magic number): Exec format error

Usando o argumento -jar:

$ java -jar ./HelloWorld.jar 
Hello World

Muitos dos meus aplicativos Java que estão na minha pasta /usr/local/bin são renomeados sem a extensão java. Eles ainda funcionam como um programa regular em meus computadores que tem a versão do Ubuntu anterior a 16.04.

Alguém sabe como adicionar essa funcionalidade à versão 16.04?

Atualizar

Clicar duas vezes nos aplicativos do navegador de arquivos funciona.

No entanto, tenho dezenas de aplicativos java que executo, exatamente como as ferramentas normais de linha de comando, como find , top , grep , netstat e assim por diante. Alguns dos comandos chamam outros aplicativos java que estão no caminho exec.

    
por L. D. James 22.05.2017 / 14:41

1 resposta

2

A resposta é registrar os binários desejados com o serviço binfmt-support .

Estudando a diferença entre o que está nas minhas instalações 16.04 e minha instalação 14.04, descobri que a versão anterior do Ubuntu tinha uma lista maior ao executar o comando update-binfmts --display .

A lista inclui um jarwrapper.

A instalação do jarwrapper resolveu o problema:

$ sudo apt install jarwrapper

O binfmt-support é um serviço que pode ser configurado para detectar o que é necessário para executar vários tipos de arquivos, incluindo chamar o Wine para executar arquivos exe do Windows.

Detalhes sobre como usar o serviço de suporte binfmt podem ser encontrados estudando as páginas do manual update-binfmts .

Curioso para saber por que o suporte padrão foi descartado. Mas estou feliz por poder restaurar manualmente este suporte para os meus computadores.

Nota

A propósito, o tipo de programa não é determinado pela extensão. É determinado pelo cabeçalho binário do aplicativo. Então o aplicativo pode ser chamado de qualquer coisa, sem uma extensão.

    
por L. D. James 23.05.2017 / 01:35