2

我需要在 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);
        }
    }
}

这是服务器日志:https ://gist.github.com/csokol/b81633bdbfa09bb55e2b

4

2 回答 2

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分支中的外观

我还在 WildFly master8.x 分支中创建了拉取请求来解决这个问题

于 2014-07-01T10:45:42.890 回答
0

当在具有 Java 平台默认安全策略(或其兼容扩展)的安全管理器下运行时,jdk.nashorn.internal.* 中的任何类都是“特权”的,因此调用者无法访问,除非特别允许访问(参见 package.json )。访问属性 $JDK/jre/lib/security/java.security 文件)。另外,从名字可以看出,这个类是内部的。如果您可以详细说明用例(即为什么需要访问 ScriptFunctionImpl),我们或许可以提出不同的方法。

于 2014-06-30T03:10:44.517 回答