Java 7应用程序错误,因为尝试使用新的Java 8 Javascript引擎Nashorn

Java 7应用程序错误,因为尝试使用新的Java 8 Javascript引擎Nashorn,java,javascript,java-7,java-8,nashorn,Java,Javascript,Java 7,Java 8,Nashorn,我用Java7打包的java应用程序在客户计算机上提供了以下堆栈跟踪。它似乎在尝试使用Java8新的Javascript引擎,尽管它确实在运行Java7,有什么想法吗 java.lang.NoClassDefFoundError: Could not initialize class jdk.nashorn.internal.objects.Global at jdk.nashorn.internal.runtime.Context.newGlobal(Context.java:778) at

我用Java7打包的java应用程序在客户计算机上提供了以下堆栈跟踪。它似乎在尝试使用Java8新的Javascript引擎,尽管它确实在运行Java7,有什么想法吗

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)

我有点挖苦了

javax.script.ScriptEngineManager
依赖SPI机制来查找和注册
ScriptEngineFactory
类。本质上,它拖网类路径,寻找这些类。显然,在您的案例中,这导致it找到了
NashornScriptEngineFactory

但是为什么呢

实际上只有3种可能性:

  • 在应用程序的类路径上有一个包含Nashorn的JAR文件

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

  • 有人在Java安装的extensions目录中添加了Nashorn


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

您能发布导致此结果的代码吗?代码看起来不错。您是否使用Java8编译代码?这可能是问题所在——但不确定!是的,我可能已经这样做了,因为我确实安装了Java8,但是为什么>会成为一个问题呢。b> 这似乎只是这个客户的问题?抱歉,我现在澄清了应用程序是使用Java 7运行的,我添加了日志摘录以确认这一点。我不使用java 8仅仅是因为预发行版都做了一件有趣的事情,安装程序没有正确呈现gui按钮,如果这个问题得到解决,我会很乐意使用java 8,但我不明白为什么java 7安装程序要寻找java 8代码。他们还没有回来(实际上是Windows 7系统)。但我已经试用了最新的Java 8,看起来还不错,所以我将捆绑Java 8 JRE并使用Java 8 JDK构建下一个版本,希望这能解决他的问题,谢谢。答案就在这篇文章右侧的“Java 7下的Nashorn”:。@RaviH-不,不是。>>This@StephenC在问题本身回答的一个层面上,用Java7运行Nashorn引擎的天真尝试也失败了,并出现了相同的错误。显然,Paul Taylor的客户犯了这个错误,他在Java 7下运行Nashorn时做了一种天真的尝试,只是在类路径中包含了Nashorn jar。如果这个人真的需要在Java7下运行nashorn,那么他就必须按照回复中的建议尝试Java7后端口。
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");