8
votes

Remplacer dans Java Rhino (JSR223) avec le nom du fichier réel

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:

javax.script.scriptException: sun.org.mozilla.javascript.internal.ecmaerror: RéférenceError: "NONXISTANT" n'est pas défini. ( # 5) dans au numéro de ligne 5

Quel bugs me est la . Plusieurs fichiers sont dans un scriptContext, et il peut être difficile de suivre une erreur. Il a aussi l'air horrible.

Y a-t-il un moyen de remplacer avec le nom de fichier actuel? Aucune des méthodes que je ne vois pas en support passe un objet de fichier, donc je suis vraiment confus ici.


0 commentaires

4 Réponses :


12
votes

Utilisez la constante scriptEngine.filename:

scriptengine.put (scriptengine.filename, scriptfile.tostring ());


0 commentaires

0
votes

Parfait!

Error: test, haha in test1.js at line number 1
Error: test2, haha in test2.js at line number 1


0 commentaires

6
votes

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: xxx

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 "" comme nom de fichier.

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.


1 commentaires

Points bonus pour celui-ci! Java 8 est longue et Java 9 prochainement. :)



3
votes

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 xxx pré>

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);
    ...
}


0 commentaires