1

当我尝试将包含一些 JavaScript 的项目导入工作区时(使用 Eclipse 的 Neon.M6 版本),我收到此错误:

eclipse.buildId=4.6.0.I20160317-0200
java.version=1.8.0_05
java.vendor=Oracle Corporation
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=en_US

org.eclipse.core.jobs
Error
Wed Mar 30 18:38:50 CEST 2016
An internal error occurred during: "Validating ****".

java.lang.NoClassDefFoundError: jdk/nashorn/internal/runtime/ECMAException
    at org.eclipse.wst.jsdt.core.dom.ASTParser.internalCreateAST(ASTParser.java:860)
    at org.eclipse.wst.jsdt.core.dom.ASTParser.createAST(ASTParser.java:651)
    at org.eclipse.wst.jsdt.internal.core.validation.JavaScriptValidator.validate(JavaScriptValidator.java:62)
    at org.eclipse.wst.validation.Validator$V2.validate(Validator.java:1159)
    at org.eclipse.wst.validation.internal.ValManager.validate(ValManager.java:704)
    at org.eclipse.wst.validation.internal.ValManager$1.visit(ValManager.java:665)
    at org.eclipse.wst.validation.internal.ValManager.accept(ValManager.java:810)
    at org.eclipse.wst.validation.internal.ValManager.validate(ValManager.java:669)
    at org.eclipse.wst.validation.internal.ValBuilderJob$Visitor.visit(ValBuilderJob.java:299)
    at org.eclipse.core.internal.resources.Resource$2.visit(Resource.java:120)
    at org.eclipse.core.internal.resources.Resource$1.visitElement(Resource.java:84)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:82)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:87)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:87)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:87)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:87)
    at org.eclipse.core.internal.watson.ElementTreeIterator.doIteration(ElementTreeIterator.java:87)
    at org.eclipse.core.internal.watson.ElementTreeIterator.iterate(ElementTreeIterator.java:129)
    at org.eclipse.core.internal.resources.Resource.accept(Resource.java:94)
    at org.eclipse.core.internal.resources.Resource.accept(Resource.java:52)
    at org.eclipse.core.internal.resources.Resource.accept(Resource.java:117)
    at org.eclipse.core.internal.resources.Resource.accept(Resource.java:105)
    at org.eclipse.wst.validation.internal.ValBuilderJob.fullBuild(ValBuilderJob.java:219)
    at org.eclipse.wst.validation.internal.ValBuilderJob.run(ValBuilderJob.java:178)
    at org.eclipse.wst.validation.internal.ValBuilderJob.runInWorkspace(ValBuilderJob.java:126)
    at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:39)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
Caused by: java.lang.ClassNotFoundException: jdk.nashorn.internal.runtime.ECMAException cannot be found by org.eclipse.wst.jsdt.core_2.0.0.v201603171403
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:444)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:357)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:349)
    at org.eclipse.osgi.internal.loader.ModuleClassLoader.loadClass(ModuleClassLoader.java:161)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 27 more

我正在使用默认情况下应包含 JSDT 的“ Eclipse for Scout Developers ”(这是 Neon 的新功能,因为 Neon的 Scout Framework 发生了变化)。

这里是我当前安装的 Eclipse 安装详细信息(仅限 JSDT 插件):

Eclipse 安装详细信息

知道这可能是什么吗?

4

1 回答 1

5

通过与 G.Erkan 的交谈,我了解到 Nashorn 是如何迷上 JSDT 的。这里我把机制写下来。我认为这足以理解和修复行为。

Nashorn 是一个 Javascript 运行时库,可从 Java 8+<java-home>/lib/ext文件夹中获取。

默认情况下,OSGi 包使用引导类加载器,它不包括 lib/ext

由于 JSDT.core 正在使用 Nashorn,JSDT 团队详细说明了一种加载此外部库的方法。

诀窍包括两部分:

在运行时: org.eclipse.wst.jsdt.nashorn.extension 包片段有一个扩展 ClassLoaderHook 的类,它通过添加 lib/ext 文件夹扩展包类路径。要激活 ClassLoaderHook,您需要在启动配置中添加以下参数以使 Hook 生效:

-Dosgi.framework.extensions=org.eclipse.wst.jsdt.nashorn.extension

实际上:您需要将参数添加到运行配置或产品配置中,以使其在运行时工作。

对于在开发时和本地 Tycho 构建中进行测试:您需要指定一个参数来告诉 Equinox 类加载器加载正常的 Java 扩展类加载器。为此,您将需要使用以下参数:

-Dorg.osgi.framework.bundle.parent=ext

实际上,您需要将参数添加到您的测试配置和 tycho 配置中。例如检查webtools.jsdt\tests\pom.xml,您可以在其中看到 Tycho surefire 参数:

<argLine>-Dorg.osgi.framework.bundle.parent=ext</argLine> 

也可以看看

于 2016-03-30T23:16:04.357 回答