web-dev-qa-db-fra.com

Qu'est-ce qui a changé pour empêcher les programmes Java de s'exécuter via le bit d'autorisation?

J'ai toujours défini le bit d'exécution sur mes Java Programmes pour les appeler comme un programme normal sans utiliser l'argument - jar ... simplement en exécutant l'application avec le nom indiqué dans le champ chemin.

Auparavant, il suffisait de: chmod +x myjavaprogram.jar, puis de l'exécuter avec ./myjavaprogram.jar à partir de la ligne de commande.

Il fonctionne toujours sur mes ordinateurs dotés de la version Ubuntu antérieure à 16.04. Cependant, cela ne fonctionne sur aucun de mes ordinateurs mis à jour vers 16.04.

Je ne trouve aucune référence au problème, en dehors des suggestions permettant de s'assurer que le bit d'exécution est défini et de certaines références permettant de s'assurer de l'installer: Sudo apt install binfmt-support

Je n'ai jamais installé le paquet auparavant, cependant, afin de résoudre le problème, j'ai exécuté le programme d'installation qui confirme qu'il est déjà installé par défaut sur Ubuntu et qu'il possède la dernière version.

Les seules autres références que je trouve avec des problèmes d'exécution de programmes Java sont les spécifications indiquant que Java est correctement installé (openjdk ou Oracle). J'ai les deux installés avec des mises à jour complètes. J'ai aussi utilisé Sudo update-alternatives --config Java pour passer de l'un à l'autre. Ils montrent tous les deux la même erreur sur la console.

C'est ce que je tire des deux méthodes:

Utilisation de la cli comme programme régulier:

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

En utilisant l'argument -jar:

$ Java -jar ./HelloWorld.jar 
Hello World

Un grand nombre de mes applications Java figurant dans mon dossier /usr/local/bin sont renommées sans l'extension Java. Ils fonctionnent toujours comme un programme régulier sur mes ordinateurs dont la version Ubuntu est antérieure à 16.04.

Personne ne sait comment ajouter cette fonctionnalité à la version 16.04?

Mise à jour

Double-cliquez sur les applications à partir du navigateur de fichiers.

Cependant, j’ai des dizaines d’applications Java exécutées comme si j’utilisais les outils de ligne de commande habituels, tels que, find, top, grep, netstat , etc. Certaines commandes appellent d’autres applications Java figurant dans le chemin d’exécution.

5
L. D. James

La solution consiste à enregistrer les fichiers binaires souhaités avec le service binfmt-support.

En étudiant la différence entre ce qui est sur mes installations 16.04 et 14.04, j'ai constaté que la version précédente d'Ubuntu avait une liste plus longue lors de l'exécution de la commande update-binfmts --display.

La liste comprend un jarwrapper.

L’installation de jarwrapper a résolu le problème:

$ Sudo apt install jarwrapper

Binfmt-support est un service qui peut être configuré pour détecter ce qui est nécessaire pour exécuter différents types de fichiers, y compris l'appel Wine pour exécuter les fichiers exe Windows.

Pour plus de détails sur l’utilisation du service d’assistance binfmt, consultez les pages de manuel pdate-binfmts.

Curieux de savoir pourquoi le support par défaut a été supprimé. Mais je suis heureux de pouvoir restaurer manuellement ce support sur mes ordinateurs.

Note

À propos, le type de programme n'est pas déterminé par l'extension. Il est déterminé par l'en-tête binaire de l'application. Ainsi, l'application peut être nommée n'importe quoi, sans extension.

2
L. D. James