1

我使用 java 7 打包的 java 应用程序在客户计算机上提供了以下堆栈跟踪。它似乎正在尝试使用 Java 8 新的 Javascript 引擎,即使它正在运行 Java 7,有什么想法吗?

java.lang.NoClassDefFoundError: Could not initialize class jdk.nashorn.internal.objects.Global
at jdk.nashorn.internal.runtime.Context.newGlobal(Context.java:778)
at jdk.nashorn.api.scripting.NashornScriptEngine$3.run(NashornScriptEngine.java:425)
at jdk.nashorn.api.scripting.NashornScriptEngine$3.run(NashornScriptEngine.java:421)
at java.security.AccessController.doPrivileged(Native Method)
at jdk.nashorn.api.scripting.NashornScriptEngine.createNashornGlobal(NashornScriptEngine.java:421)
at jdk.nashorn.api.scripting.NashornScriptEngine.<init>(NashornScriptEngine.java:181)
at jdk.nashorn.api.scripting.NashornScriptEngine.<init>(NashornScriptEngine.java:152)
at jdk.nashorn.api.scripting.NashornScriptEngineFactory.getScriptEngine(NashornScriptEngineFactory.java:141)
at javax.script.ScriptEngineManager.getEngineByName(Unknown Source)

我不知道他是否安装了 Java 8(但我问过),但我知道他实际上是在使用 Java 7 来运行应用程序,因为我在启动时会自动检查和记录。这使

18/02/2014 21.47.09:com.jthink.songkong.cmdline.SongKong:writeSystemInfo:INFO: SongKong 1.17.0 using Java 1.7.0_45 24.45-b08 32bit on Windows 7 6.1 x86 初始化成功

失败的代码很简单:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
4

1 回答 1

2

我有点挖了...

javax.script.ScriptEngineManager依赖于 SPI 机制来查找和注册类ScriptEngineFactory。本质上,它搜索类路径,寻找这些类。显然,在您的情况下,这导致它找到NashornScriptEngineFactory.

但为什么?

好吧,实际上只有 3 种可能性:

  • 您有一个 JAR 文件,在应用程序的类路径中包含 Nashorn。

  • 您正在使用在其 JAR 文件之一中包含 Nashorn 的 JVM。

  • 有人在 Java 安装的扩展目录中添加了 Nashorn。

要找出哪个,我建议您使用find查找客户端系统上的所有 JAR 文件,然后使用jar tvf some.jar | grep Nashorn尝试查找提供 Nashorn 类的 JAR。

于 2014-02-22T15:07:41.977 回答