我需要从运行在WildFly中的Web应用程序中的nashorn访问内部类。
以下代码在我的机器上正常运行:
public class NashornTest {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> cls = Class.forName("jdk.nashorn.internal.objects.ScriptFunctionImpl");
System.out.println(cls);
}
}
但是当我在WildFly中运行时,以下servlet抛出了ClassNotFoundException:
@WebServlet("/nashorn")
public class NashornServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Class<?> cls = null;
try {
cls = Class.forName("jdk.nashorn.internal.objects.ScriptFunctionImpl");
} catch (ClassNotFoundException e) {
throw new ServletException(e);
}
}
}
答案 0 :(得分:2)
看起来nashorn使用的所有包/类都存在疏忽。
您需要打开WILDFLY_HOME / modules / system / layers / base / sun / jdk / main / module.xml 文件并添加
<path name="jdk/nashorn/api/scripting"/>
<path name="jdk/nashorn/api/scripting/resources"/>
<path name="jdk/nashorn/internal/codegen"/>
<path name="jdk/nashorn/internal/codegen/types"/>
<path name="jdk/nashorn/internal/ir"/>
<path name="jdk/nashorn/internal/ir/annotations"/>
<path name="jdk/nashorn/internal/ir/debug"/>
<path name="jdk/nashorn/internal/ir/visitor"/>
<path name="jdk/nashorn/internal/lookup"/>
<path name="jdk/nashorn/internal/objects"/>
<path name="jdk/nashorn/internal/objects/annotations"/>
<path name="jdk/nashorn/internal/parser"/>
<path name="jdk/nashorn/internal/runtime"/>
<path name="jdk/nashorn/internal/runtime/arrays"/>
<path name="jdk/nashorn/internal/runtime/linker"/>
<path name="jdk/nashorn/internal/runtime/options"/>
<path name="jdk/nashorn/internal/runtime/regexp"/>
<path name="jdk/nashorn/internal/runtime/regexp/joni"/>
<path name="jdk/nashorn/internal/runtime/resources"/>
<path name="jdk/nashorn/internal/runtime/resources/fx"/>
<path name="jdk/nashorn/internal/runtime/scripts"/>
<path name="jdk/nashorn/internal/tools"/>
<path name="jdk/nashorn/internal/tools/resources"/>
<path name="jdk/internal/dynalink"/>
<path name="jdk/internal/dynalink/beans"/>
<path name="jdk/internal/dynalink/linker"/>
<path name="jdk/internal/dynalink/support"/>
以及可能缺少的任何其他路径/包。
供参考,这是此文件在8.x branch
中的显示方式我还创建了Pull请求以在WildFly master和8.x branch中修复此问题
答案 1 :(得分:0)
在具有Java平台默认安全策略(或其兼容扩展)的安全管理器下运行时,jdk.nashorn.internal。*中的任何类都是“特权”,因此除非特别允许访问,否则调用者无法访问(请参阅package.access属性$ JDK / jre / lib / security / java.security文件)。此外,正如您从名称中看到的,此类是内部的。如果您可以详细说明用例(即,您需要访问ScriptFunctionImpl的原因),我们可以建议一种不同的方法。