java - 无法执行使用 Rhino JavaScript 编译器编译的 JavaScript 文件

标签 java javascript classpath rhino noclassdeffounderror

好的,所以我创建了一个名为 HelloWorld.js 的 JavaScript 文件,其中包含以下内容:

java.lang.System.out.println("Hello World!");

现在,我使用 Rhino JavaScript 编译器使用以下命令编译它(js.jar 文件在我的类路径中):

java org.mozilla.javascript.tools.jsc.Main HelloWorld.js

它按预期编译了 JavaScript 文件并创建了 Java 类文件。然后我尝试通过调用 java HelloWorld 来执行 Java 类文件。但是,它生成了以下错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
Caused by: java.lang.ClassNotFoundException: HelloWorld
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: HelloWorld. Program will exit.

我试图了解导致 java.lang.NoClassDefFoundError 被抛出的原因,以及我在 blog post 中阅读的内容我了解到,如果类在编译时存在但在运行时在 Java 类路径中不可用,则会抛出 java.lang.NoClassDefFoundError

所以我运行了 javap HelloWorld 命令来检查问题是什么,这就是我得到的结果:

public class HelloWorld extends org.mozilla.javascript.NativeFunction implements org.mozilla.javascript.Script {
    public HelloWorld();
    public static void main(java.lang.String[]);
    public final java.lang.Object exec(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable);
    public final java.lang.Object call(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[]);
    public int getLanguageVersion();
    public java.lang.String getFunctionName();
    public int getParamCount();
    public int getParamAndVarCount();
    public java.lang.String getParamOrVarName(int);
    public boolean getParamOrVarConst(int);
}

现在,我从中了解到 HelloWorld 类存在并被声明为 public。因此,Java 虚拟机没有理由找不到它。这就是我感到困惑的地方。我不知道从这里到哪里去,也不知道如何解决这个问题。

我发现如果我调用 Rhino 在 HelloWorld 实例上调用 exec 方法,我可以执行 Java 类文件,如下所示:

java -jar /usr/share/rhino/js.jar HelloWorld.class

但是,由于 js.jar 文件已经在我的类路径中,因此我想直接使用 java HelloWorld 命令执行 Java 类文件。我想了解问题所在,以便了解幕后真正发生的事情。

最佳答案

您确定类文件在类路径中(以及 js.jar)吗?

尝试

java -cp .;js.jar HelloWorld

(假设 HelloWorld.class 在当前目录中,否则类似于 -cp build;js.jar)。

关于java - 无法执行使用 Rhino JavaScript 编译器编译的 JavaScript 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9653526/

相关文章:

java - NoClassDefFoundError 和 ClassNotFoundException 的原因和区别是什么?

java - 403访问禁止错误-当url具有动态路径参数时spring security

java - 继承类之间的静态方法 - Java

java - GWT 2.7 资源是通过 ClassLoader 找到的。它应该通过 .gwt.xml 中的 <source/> 或 <resource/> 条目进行注册

javascript - 设置 Yeoman——多个 bower_components

javascript - 将 'active' 类添加到幻灯片导航

Java Netbeans 类路径问题

java - 设置一个第三方 JAR 的类路径以包含另一个带有 Ant 的类路径

java - 什么是 Struts .struts.mex 文件

javascript - 如何更新或删除 ngrx 实体中的嵌套对象?