2017-03-01 24 views
2

Java 8 (Open JDK)에서 실행되는 Wildfly 8.2.1의 이상한 동작에 직면하고 있습니다. Java 7에서이 문제가 발생하지 않았기 때문에 특히 Java 8을 언급하고 있습니다.Wildfly 8.2 - 서버 시작시 ScriptEngineManager.getEngineFactories가 비어 있습니다.

Wildfly 모듈이 시작되는 동안 Java RhinoScriptEngine을 사용하여 JavaScript를로드하는 코드가 있습니다. scriptEngine 이후

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

null로 지정 받고, 내가 디버그 로그를 추가 engineFactories 단지 인 것으로 나타났습니다 빈 List (음, engineFactories 자체가 디버깅 목적으로 만 인출되고 있습니다). 그러나 모듈 시작이 완료되면이 정확한 코드가 작동하고 RhinoScriptEngineFactory이 나열됩니다.

Wildfly 8.2에서 인식하지 못하는 Java 8에서 변경된 사항이 있습니까? 아니면 모듈에 명시 적 종속성을 추가해야합니까?

+0

''js ''대신''nashorn "'을 사용해야 할 수도 있습니다. 아니면, "javascript"가 Rhino와 Nashorn 모두에서 작동 할 수도 있습니다. 더 확실하지 않아서 미안해. 나는 내 코드가 무엇인지 알아 내려고하고있다. – Pointy

+0

그러나 동일한 코드는 시작이 완료된 후 응용 프로그램의 다른 기능을 통해 완벽하게 작동합니다. 그리고 Rhino 엔진을 사용합니다. – aathif

+0

예, 이상하게 보입니다. – Pointy

답변

1

스크립트 엔진 관리자는 service provider 메커니즘을 사용하여 ScriptEngineFactory의 모든 구현을 열거합니다. . ScriptEngineFactory에 서비스 설명이

  1. 는 Thread.currentThread() getContextClassLoader()에서 액세스 가능한 자원에서 검색됩니다 - 때 매개 변수가없는 구조의 ScriptEngnineManage
  2. Bootrap 클래스 로더 - 널 매개 변수를
  3. 클래스 로더를 ScriptEngnineManager를 구성 할 때 - 때 Swith 특정 클래스 로더를 구성하십시오.

어떻게 ScriptEngineManager를 만드십니까?

매개 변수없이 ScriptEngineManager를 구성한 경우 : 모듈이 부팅 될 때 및 모듈 부팅이 완료 될 때 Thread.currentThread(). getContextClassLoader()를 반환합니다.

모듈 (module)에 module.xml을 붙여 넣을 수 있습니까?

java 8 rhino 스크립트 엔진은 nashorn 스크립트 엔진으로 대체되었습니다. 모듈이로드 된 후 RhinoScriptEngineFactory를 실제로 얻습니까? 아니면 NashornScriptEngine입니까?

+0

클래스 로딩과 관련이 있습니다. 따라서, 2 가지 문제가있었습니다. i) rhino jar는 제 모듈이 의존하는 다른 jboss 모듈의 일부 였고, 이는 서버 시작이 완료된 후 왜 작동하는지 설명했습니다. ii) ClassLoader를 전달하지 않고 현재 스레드 컨텍스트 로더를 사용하고 있었고 분명히 종속 모듈 클래스에 대한 가시성이 없었습니다. 내 모듈의 일부였던 클래스에 의해 사용 된 ClassLoader를 통과 시켰습니다. – aathif