2017-03-01 9 views
2

Java 8(Open JDK)上で動作するWildfly 8.2.1で奇妙な動作に直面しています。私は特にJava 8について言及しています。なぜなら、この問題はJava 7では見られなかったからです。Wildfly 8.2 - サーバの起動時にScriptEngineManager.getEngineFactoriesが空です。

私のWildflyモジュールが起動している間、Java RhinoScriptEngineを使用してJavaScriptをロードするコードがあります。

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

scriptEnginenullとして割り当てられていたので、私は、デバッグログを添加しengineFactoriesは(良く、engineFactories自体のみデバッグ目的のためにフェッチされている)Listちょうど空であることに気づきました。しかし、モジュールの起動が完了した後、この正確なコードが動作し、RhinoScriptEngineFactoryが表示されます。

Wildfly 8.2が認識していないJava 8で変更されたことがありますか、または明示的な依存関係をモジュールに追加する必要がありますか?

+0

'' js "'の代わりに '' nashorn "'を使う必要があるかもしれません。あるいは、私は、 "javascript"はRhinoとNashornの両方で動作するかもしれないと思います。より確定的なことを申し訳なく思う。私は自分のコードが何をしているのか見ようとしています。 – Pointy

+0

しかし、同じコードは、起動が完了した後、アプリケーションの別の機能を使って完全に動作します。また、Rhinoエンジンを使用します。 – aathif

+0

はい、それは奇妙に思えます。 – Pointy

答えて

1

スクリプトエンジンマネージャは、service providerメカニズムを使用して、ScriptEngineFactoryのすべての実装を列挙します。パラメータ

  • BootrapクラスローダなしScriptEngnineManageを構築するとき - - nullのパラメータ
  • クラスローダーでScriptEngnineManagerを構築するとき - とき。ScriptEngineFactoryにサービス記述は、getContextClassLoader())

    1. にThread.currentThread(からアクセス可能なリソースに検索されますswith固有のクラスローダーを作成する

    ScriptEngineManagerはどのように作成しますか?

    パラメータなしでScriptEngineManagerを構築すると、モジュールが起動しているときとモジュールの起動が完了したときにThread.currentThread()。getContextClassLoader()が返されます。

    モジュールのmodule.xmlを貼り付けることができますか?

    Java 8では、rhinoスクリプトエンジンがnashorn script engineに置き換えられました。モジュールがロードされた後、実際にRhinoScriptEngineFactoryを取得しますか?それともNashornScriptEngineですか?

  • +0

    それはクラスの読み込みと関係がありました。そこで、2つの問題がありました。i)サイバージャーは私のモジュールが依存していた別のjbossモジュールの一部であり、これはサーバーの起動が完了した後になぜ機能するのか説明しました。 ii)ClassLoaderを渡さず、現在のスレッドコンテキストローダーを使用していました。明らかに、依存モジュールクラスの可視性がありませんでした。私は、私のモジュールの一部であったクラスで使用されていたClassLoaderを渡しました。 – aathif

    関連する問題