Dans mon code, tous les scripts sont contenus dans les fichiers .js. Chaque fois que l'un des scripts contient une erreur, je reçois ceci: p>
javax.script.scriptException: sun.org.mozilla.javascript.internal.ecmaerror: RéférenceError: "NONXISTANT" n'est pas défini. (
4 Réponses :
Utilisez la constante scriptEngine.filename: p>
scriptengine.put (scriptengine.filename, scriptfile.tostring ()); p>
Parfait!
Error: test, haha in test1.js at line number 1 Error: test2, haha in test2.js at line number 1
La question n'a pas encore été spécifiquement posée, mais je pensais offrir cela à quiconque qui tombe sur ce sujet à l'avenir: cela changera lorsque Java 8 est libéré et que nous passons de Rhino à Nashorn en tant que sous-jacent. Moteur JavaScript. Sous Nashorn, le nom du fichier est appliqué au scriptContext, plutôt qu'à la scriptengine elle-même: Si vous essayez d'appliquer le nom du fichier à l'aide de scriptEngine.put (), comme vous le faites sous Rhino , rien ne se produira et vos exceptions vont retourner " J'imagine que quelques personnes se heurteront à cette question dans les prochains mois, alors pensais-je . Cela ne semble pas être documenté nulle part. J'ai dû creuser dans le code source de Nashorn pour le comprendre. P> p>
Points bonus pour celui-ci! Java 8 est longue et Java 9 prochainement. :)
La manière Java 8 (Nashorn) de régler le nom de fichier du moteur de script via le scriptContext figuré par Matj65816, fonctionne également pour le moteur de Rhino. Donc, je recommanderais d'utiliser uniquement puisque cette pièce de code fonctionne pour les moteurs JavaScript communs. Vous n'avez pas besoin d'événement de vous créer votre propre contexte, mais définissez uniquement l'attribut sur le contexte par défaut du moteur: P> ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
if (engine != null) {
ScriptContext ctx = engine.getContext();
ctx.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
...
}