2016-06-09 1 views
5

Il existe plusieurs questions sur la façon de déterminer le moteur JavaScript dans le navigateur. Je dois écrire du code javascript qui doit fonctionner sur rhino et nashorn.Comment puis-je déterminer quel moteur javascript, rhino ou nashorn utilise mon code?

Comment puis-je déterminer si mon code s'exécute sur rhino ou nashorn? Existe-t-il des fonctions, des variables, des constantes typciales où vous pouvez déterminer le moteur?

+3

Intéressant. Pourquoi avez-vous besoin du chèque? –

+0

Si vous demandez à propos de rhino vs nashorn, ne vous posez pas simplement des questions sur JDK SE 8 vs> 8? –

+0

@JohnGreen: * "... à propos de JDK SE 8 vs> 8?" * Nashorn a été ajouté dans JDK8 (pas> 8). Et il est [encore possible d'exécuter Rhino dans JDK8] (https://wiki.openjdk.java.net/display/Nashorn/Using+Rhino+JSR-223+engine+with+JDK8) (mais vous devez ajouter un pot et faites-le exprès). –

Répondre

1

En regardant le Rhino to Nashorn migration guide, je vois plusieurs façons possibles.

Si vous n'êtes pas en utilisant le script de compatibilité Rhino, ce serait le faire:

var usingNashorn = typeof importClass !== "function"; 

... depuis importClass est défini pour Rhino, mais pas pour Nashorn (sauf si vous incluez le script de compatibilité).

Je pense que Java.type est Nashorn spécifique, donc:

var usingNashorn = typeof Java !== "undefined" && Java && typeof Java.type === "function"; 

Vous pouvez vérifier pour l'emballage des exceptions:

var usingNashorn; 
try { 
    // Anything that will throw an NPE from the Java layer 
    java.lang.System.loadLibrary(null); 
} catch (e) { 
    // false! 
    usingNashorn = e instanceof java.lang.NullPointerException; 
} 

... depuis le guide de migration dit que sera true pour Nashorn mais false pour Rhino. Cela implique de lancer une exception, ce qui est regrettable.

+0

# 2 est mon préféré. Vérification sur _Java_ est vraiment tester une fonctionnalité Nashorn. Je ne m'attends pas à ce que cela soit ajouté à Rhino. – Christian13467

1

Avec l'option --no-java, "Java" n'est pas défini comme objet dans Nashorn. Le mieux serait de vérifier quelque chose qui est toujours disponible à Nashorn. Quelque chose comme DIR ou FILE variable est un bon candidat. Toujours là à nashorn.

JJS> typeof DIR

chaîne

Si vous utilisez l'API javax.script (et non JJS), vous pouvez obtenir le nom du moteur et vérifier ainsi:

import javax.script.*; 

public class Main { 
    public static void main(String[] args) throws Exception { 
    ScriptEngineManager m = new ScriptEngineManager(); 
    ScriptEngine e = m.getEngineByName("nashorn"); 
    System.out.println(e.getFactory().getEngineName()); 
    } 
} 

Avec Nashorn, vous voyiez "Oracle Nashorn" comme nom du moteur.

+0

Nous utilisons le moteur intégré dans une application Java. C'est une fonctionnalité d'avoir un accès complet aux classes de l'application autour. – Christian13467

+0

Okay. Dans ce cas, je vous recommande de vérifier que le nom du moteur est "Oracle Nashorn". Ce nom devrait être stable pour Nashorn. –