【问题标题】:Javascript engine (Nashorn) is not recognized with Java 8 called from spring-hadoop从 spring-hadoop 调用的 Java 8 无法识别 Javascript 引擎(Nashorn)
【发布时间】:2017-01-06 22:58:02
【问题描述】:

我们正在尝试升级我们的系统以使用 Java 8 而不是 Java 7。

在我们的 Spring-Hadoop xml 中的一些流程配置中,我们定义了一个实际上是 javascript 脚本的预操作。

使用 Java 7 可以正常工作,但是将 java 版本更改为 java 8 时,尝试运行此进程时会引发异常(请参阅下面的堆栈跟踪)。

我看到 Java 8 使用与 Java 6 或 7 不同的引擎来运行 Javascript 代码(Nashorn 而不是 Rhino)。似乎这个引擎可以工作 - 我尝试了 jss (http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html) 实用程序,效果很好。

这是我的 xml(相关部分):

    <hdp:script id="prepare-hdfs" location="scripts/prepare-windows-hdfs.js"/>

    <bean id="runner" class="org.springframework.data.hadoop.mapreduce.JobRunner">
        <property name="runAtStartup" value="true" />
        <property name="waitForCompletion" value="false"/>
        <property name="killJobAtShutdown" value="false"/>
        <property name="preAction">
            <list>
                <ref bean="prepare-hdfs" />
            </list>
        </property>
        <property name="jobs">
            <list>
                <ref bean="my-job" />
            </list>
        </property>
    </bean>

这里是 scripts/prepare-windows-hdfs.js 文件的内容:

if (java.lang.System.getProperty("os.name").startsWith("Windows")) {
    // 0655 = -rwxr-xr-x
     org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_DIR_PERMISSION.fromShort(0655)
     org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_FILE_PERMISSION.fromShort(0655)
}

我尝试在脚本的开头添加以下行:

try {load("nashorn:mozilla_compat.js");} catch (e) {} // for Java 8

正如http://docs.spring.io/autorepo/docs/spring-hadoop/2.2.1.RELEASE/reference/html/springandhadoop-fs.htmlSwitching from Rhino to Nashorn 中的建议,但没有帮助。

我尝试使用内联脚本。即:

<hdp:script id="prepare-hdfs" language="javascript" >
    // 'hack' default permissions to make Hadoop work on Windows
    try {load("nashorn:mozilla_compat.js");} catch (e) {} // for Java 8

    if (java.lang.System.getProperty("os.name").startsWith("Windows")) {
        // 0655 = -rwxr-xr-x
        org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_DIR_PERMISSION.fromShort(0655)
        org.apache.hadoop.mapreduce.JobSubmissionFiles.JOB_FILE_PERMISSION.fromShort(0655)
    }
</hdp:script>

然而,它也没有帮助。

这是抛出的异常:

原因:java.lang.IllegalArgumentException:没有合适的引擎 在以下位置找到扩展 js org.springframework.util.Assert.notNull(Assert.java:112) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.discoverEngine(Jsr223ScriptEvaluator.java:101) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.evaluate(Jsr223ScriptEvaluator.java:74) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptRunner.call(Jsr223ScriptRunner.java:75) 在 org.springframework.data.hadoop.scripting.HdfsScriptRunner.call(HdfsScriptRunner.java:68) 在 org.springframework.data.hadoop.mapreduce.JobRunner.invoke(JobRunner.java:88) 在 org.springframework.data.hadoop.mapreduce.JobRunner.call(JobRunner.java:51) 在 org.springframework.data.hadoop.mapreduce.JobRunner.afterPropertiesSet(JobRunner.java:44) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ... 20 更多

或:

原因:java.lang.IllegalArgumentException:没有合适的引擎 找到语言 javascript 在 org.springframework.util.Assert.notNull(Assert.java:112) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.discoverEngine(Jsr223ScriptEvaluator.java:101) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptEvaluator.evaluate(Jsr223ScriptEvaluator.java:74) 在 org.springframework.data.hadoop.scripting.Jsr223ScriptRunner.call(Jsr223ScriptRunner.java:75) 在 org.springframework.data.hadoop.scripting.HdfsScriptRunner.call(HdfsScriptRunner.java:68) 在 org.springframework.data.hadoop.mapreduce.JobRunner.invoke(JobRunner.java:88) 在 org.springframework.data.hadoop.mapreduce.JobRunner.call(JobRunner.java:51) 在 org.springframework.data.hadoop.mapreduce.JobRunner.afterPropertiesSet(JobRunner.java:44) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) ... 20 更多

我使用的确切 JDK 是:jdk1.7.0_79.x86_64(有效)和 jdk1.8.0_92.x86_64(无效)。

【问题讨论】:

    标签: java spring hadoop java-8 nashorn


    【解决方案1】:

    显然,应用程序中的类路径为空,但添加了 rt.jar。但是,由于在 java8 中脚本位于 ext 目录中,因此它们没有被添加到类路径中。所以,我只是将这条路径添加到 CP 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 2019-01-22
      • 2017-07-09
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      相关资源
      最近更新 更多