2017-03-01 1 views
2

Je suis face à un comportement bizarre avec wildfly 8.2.1 en cours d'exécution sur Java 8 (Open JDK). Je mentionne spécifiquement Java 8, parce que je n'ai pas vu ce problème sur Java 7.wildfly 8.2 - ScriptEngineManager.getEngineFactories est vide au démarrage du serveur

Pendant que mon module Wildfly est démarré, j'ai du code qui charge JavaScripts en utilisant Java RhinoScriptEngine.

List<ScriptEngineFactory> engineFactories = engineManager.getEngineFactories(); 
    ScriptEngine scriptEngine = engineManager.getEngineByName("js"); 

Depuis scriptEngine a été désigné comme étant null, j'ai ajouté les journaux de débogage et remarqué que engineFactories est juste un vide List (bien, le engineFactories lui-même est tiré par les cheveux que pour des fins de débogage). Mais, après le démarrage du module est terminé, ce code fonctionne, et répertorie les RhinoScriptEngineFactory.

Y at-il quelque chose qui a été changé en Java 8 que wildfly 8.2 ne connaît pas, ou dois-je ajouter des dépendances explicites à mon module?

+0

Vous devrez peut-être utiliser '" nashorn "' à la place de '" js "'. Ou, je pense, '' javascript ''peut fonctionner à la fois pour Rhino et Nashorn. Désolé de ne pas être plus définitif; J'essaie de voir ce que fait mon propre code. – Pointy

+0

Mais, le même code fonctionne parfaitement, via une autre fonctionnalité de l'application, une fois le démarrage terminé. Et il utilise le moteur Rhino. – aathif

+0

Oui cela semble étrange. – Pointy

Répondre

1

gestionnaire de moteur de script utilise le mécanisme service provider d'énumérer toutes les implémentations de ScriptEngineFactory. descriptions de service ScriptEngineFactory sont recherchées dans les ressources accessibles depuis

  1. Thread.currentThread() getContextClassLoader() -. lorsque construction ScriptEngnineManage sans paramètre
  2. Bootrap chargeur de classe - lorsque la construction d'ScriptEngnineManager avec le paramètre null
  3. Chargeur de classe - quand Construire un chargeur de classes spécifique à swith

Comment créer un ScriptEngineManager?

Si vous construisez ScriptEngineManager sans paramètres: Que retourne Thread.currentThread(). GetContextClassLoader() lorsque le module est en cours de démarrage et lorsque le démarrage du module est terminé? Pouvez-vous joindre (télécharger vers pastebin ou quelque part) module.xml pour votre module?

En java 8 moteur de script rhino a été remplacé par le moteur de script nashorn. Avez-vous vraiment RhinoScriptEngineFactory après le chargement du module? Ou est-ce NashornScriptEngine?

+0

Cela avait à voir avec le chargement des classes. Donc, il y avait 2 problèmes - i) les jarres de rhinocéros faisaient partie d'un autre module de jboss dont dépendait mon module, cela expliquait pourquoi cela fonctionnait après le démarrage du serveur. ii) Je ne passais pas le ClassLoader et il utilisait le chargeur de contextes de threads en cours, et apparemment il n'avait pas de visibilité sur les classes de modules dépendants. J'ai passé le ClassLoader qui était utilisé par une classe qui faisait partie de mon module et cela a fonctionné. – aathif