Archives du mot-clé JRE

Java et Mac OS X… et Scilab

Les utilisateurs de Scilab sur Mac ont fait entendre leurs voix ces derniers temps.

Tout d’abord à cause d’une incompatibilité avec OS X 10.10 Yosemite. Scilab Enterprises a réagit rapidement en fournissant une version spécifique de Scilab.

Ensuite, à propos du fait que Scilab utilise encore une version de Java qui n’est plus fournie (par défaut) par Apple avec les versions récentes de Mac OS X. C’est ce point qui va être développé ici.

Autant vous le dire tout de suite, ce billet de blog ne vous donnera pas de solution pour utiliser une version plus récente de Java avec Scilab. Je vais plutôt essayer de vous expliquer pourquoi Scilab a besoin de Java et vous montrer les éventuelles limitations de la version 6.

Java

Java est un langage de programmation dont le but est de simplifier la portabilité du code sur les systèmes d’exploitation courants (Windows, Linux, Mac OS X).

Commençons par expliquer brièvement certains acronymes de l’univers Java.

SE ? EE ? ME ?

  • SE (Standard Edition) : distribution « classique »
  • EE (Enterprise Edition) : distribution destinée aux applications d’entreprise
  • ME (Micro Edition) : distribution destinée aux applications embarquées

C’est donc la distribution SE que nous retrouvons sur la plupart de nos machines.

JRE ? JDK ?

Contrairement à un langage compilé, le code Java a besoin d’un interpréteur pour être exécuté par le système. On parle de machine virtuelle (ou JVM). La distribution de Java est également fournie avec des bibliothèques standards. La JVM et ces bibliothèques composent le JRE (Java Runtime Environment). Le JRE permet d’exécuter du code Java sur une machine.

Si vous souhaitez écrire et/ou compiler du code Java, il vous faut des outils supplémentaires. Ces outils constituent le JDK (Java Development Kit ou encore Java SE Development Kit). Pour simplifier la vie du développeur, le JDK inclu le JRE.

Pour résumer, vous avez besoin du JRE pour exécuter du code Java. Si vous avez déjà installé le JDK, vous n’avez normalement pas besoin d’installer un JRE supplémentaire.

Numérotation des versions

Vous en savez maintenant un peu plus sur les acronymes SE, JDK et JRE. Qu’en est-il des numéros de versions : 6, 7, 8 ? 1.6, 1.7, 1.8 ? Cette double numération désigne soit la version de la distribution SE, soit celle du JDK (ou du JRE).

  • Java SE 6 -> JDK 1.6 -> JRE 1.6
  • Java SE 7 -> JDK 1.7 -> JRE 1.7
  • Java SE 8 -> JDK 1.8 -> JRE 1.8

Java et Mac OS X

Intéressons nous au cas particulier de Java sur Mac OS X. Java est développé par la société Oracle (après rachat de Sun). Or, Apple a développé en parallèle sa propre version de Java. Du moins jusqu’à la version 6. La dernière version de Java publiée par Apple est la 1.6.0_65 publiée le 15 octobre 2013 (Java pour OS X 2014-001). Pour une version plus récente, rendez-vous sur le site d’Oracle (Java SE Downloads).

Et Scilab dans tout ça

Pourquoi Scilab utilise Java ?

Scilab utilise Java entres autres pour les affichages graphiques. Voir à ce sujet la liste des dépendences de Scilab 5.X. Pour fonctionner correctement, Scilab a donc besoin d’un JRE.

Linux et Windows

Il n’y a aucun soucis avec Linux et Windows, puisque l’installateur de Scilab inclut un JRE. Après l’installation, ce JRE se trouve dans le dossier SCI+'/java' pour Windows et SCI+'/../../thirdparty/java' pour Linux. Pour Scilab 5.5.1, il s’agit de la version 1.6.0_41.

Mac OS X

L’installateur de Scilab pour Mac OS X ne contient pas de JRE. Les développeurs de Scilab ont sans doute jugé plus simple d’utilisé le JRE fourni par Apple. Sauf qu’avec les versions récentes de OS X, Apple a décidé de ne plus installer de JRE par défaut. Donc Scilab ne peut plus démarrer.

La seule solution consiste donc à installer soi-même un JRE. Et de préférence le bon : Java pour OS X 2014-001 !

Les développeurs de Scilab connaissent bien entendu ce problème depuis longtemps. Comme le montre ce commentaire tiré des sources (/modules/jvm/src/c/JVM_Unix.c) :

/* Under Mac OS X, we are using the JVM provided by the distribution.
* However, this might change with Java 7 since Apple will no longer provide
* Java with Mac OS X */

Pourquoi le JRE 1.6 et pas le 1.7 ou le 1.8 ?

Le passage d’un JRE à un autre n’est pas anodin. La version 1.7 nécessite par exemple au minimum Mac OS X 10.7.3. Passer du JRE 1.6 au JRE 1.7 demande également de relancer toute la batterie de tests pour s’assurer de la compatibilité. Et il faut bien entendu des développeurs disponibles.

Il faut donc mettre en rapport les gains (bibliothèques, performances…) apportés par la nouvelle version, face à la quantité de travail que nécessite la migration.

Limitation du JRE 1.6 pour Scilab

Le JRE 1.6 limite-t-il l’utilisation de Scilab ? On l’aura compris, cela limite juste la capacité de Scilab à exécuter du code Java récent (voir la section « Java depuis Scilab » dans la documentation de Scilab).

Le problème surviendra donc si le code Java utilise des instructions non prises en charge par le JRE 1.6. Ou bien si le code a été compilé avec une version plus récente du JDK (1.7 ou 1.8).

Dans les deux cas, voici l’erreur qui sera renvoyée par Scilab (jimport) :

jimport: An error occured: Exception when calling Java method : ******* : Unsupported major.minor version 51.0

A quand la prise en charge d’une version plus récente du JRE ?

D’après un tweet du 22 octobre 2014 de @Scilab :

Java sera mis à jour dans la prochaine famille de Scilab. En attendant pour pouvoir lancer Scilab 5.5.1 vous avez besoin de Java 6

Conclusion

Vous en savez maintenant un peu plus sur Scilab et Java sur Mac OS X. L’utilisation du JRE 1.6 n’est pas une limitation pour la plupart des utilisateurs de Scilab.

Erreur fatale du JRE au lancement de MATLAB (ntdll.dll)

A l’aide d’un MEX récalcitrant, j’ai fini par faire crasher MATLAB pour de bon.

Plus moyen de lancer MATLAB :?

J’ai trouvé des fichiers nommés « hs_err_pidXXXX.log » dans le dossier de démarrage de MATLAB.

Le début du contenu de ces fichiers est :

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000776508c5, pid=2328, tid=3600
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.3-b01 mixed mode windows-amd64 )
# Problematic frame:
# C  [ntdll.dll+0x508c5]
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

Le problème vient en fait d’un fichier corrompu dans le dossier des préférences MATLAB.

Sur Windows 7, le chemin vers ce dossier est le suivant :

C:\Users\<NOM D’UTILISATEUR>\AppData\Roaming\MathWorks\MATLAB\<VERSION DE MATLAB>

La solution est donc extrêmement simple et consiste à vider entièrement le contenu de ce dossier puis à démarrer MATLAB. De nouveaux fichiers de préférences seront automatiquement créés.

Si vous souhaitez conserver certains fichiers de préférences (les XML), déplacez simplement les fichiers dans un dossier temporaire puis démarrez MATLAB. Replacez un à un les fichiers à conserver dans le dossier des préférences en démarrant puis en fermant MATLAB à chaque fois.

Ouf !