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 内で実行すると、次のサーブレットが 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マスターおよび8.x ブランチでこれを修正するためのプル リクエストも作成しました。

于 2014-07-01T10:45:42.890 に答える
0

Java プラットフォームのデフォルトのセキュリティ ポリシー (またはその互換性のある拡張機能) を使用してセキュリティ マネージャーの下で実行している場合、jdk.nashorn.internal.* 内のクラスはすべて「特権付き」であるため、特にアクセスが許可されていない限り、呼び出し元はアクセスできません (パッケージを参照)。プロパティ $JDK/jre/lib/security/java.security ファイルにアクセスします)。また、名前からわかるように、このクラスは内部クラスです。ユースケース (つまり、なぜ ScriptFunctionImpl にアクセスする必要があるのか​​) を詳しく説明していただければ、別のアプローチを提案できるかもしれません。

于 2014-06-30T03:10:44.517 に答える