2012-03-11 59 views
4

好的编译JavaScript文件,所以我创建一个包含以下内容命名HelloWorld.js JavaScript文件:无法执行通过Rhino 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.lang.NoClassDefFoundError抛出但在运行时在Java类路径中不可用。

所以我跑了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虚拟机无法找到它。这是我困惑的地方。我不知道该从哪里出发,也不知道如何解决这个问题。

我发现,如果我调用犀牛调用exec方法上的HelloWorld一个实例如下,我可以执行Java类文件:

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

不过,我想执行的Java类文件直接使用java HelloWorld命令,因为js.jar文件已经在我的类路径中。我想了解问题是什么,以便我知道幕后发生了什么。

+1

'JavaScript文件名为HelloWorld.java' o_O。 Rhino执行'js'(javascript)文件,而不是'Java'文件。为了运行Java程序,人们不需要拥有Rhino。 – kirilloid 2012-03-11 08:34:27

+0

@kirilloid:为了运行由Rhino编译的Java类,需要Rhino运行时库。 – Thilo 2012-03-11 08:37:31

+0

@Thilo Rhino是否将'js'编译为'Java'? – kirilloid 2012-03-11 08:40:49

回答

3

您确定该类文件位于类路径(以及js.jar)吗?

尝试

java -cp .;js.jar HelloWorld 

(在当前目录中假设的HelloWorld.class,否则像-cp build;js.jar)。 `

+0

我发现问题是什么。我的'HelloWorld'类不在类路径中。所以我在我的'.bashrc'中更新了下面一行,以反映'export CLASSPATH =/usr/share/rhino/js.jar:$ HOME/class'的变化。然后我将我的'HelloWorld.class'文件移动到'$ HOME/class'。这解决了问题。当我从'class'目录执行'java HelloWorld'时,它向我显示输出没有任何错误。感谢您的帮助。我还有一个问题:当我明确地尝试执行它时,为什么Java虚拟机不能找到我的'HelloWorld.class'文件?我不明白发生了什么事。 – 2012-03-11 09:06:40

+0

当前目录不一定在类路径中。我认为,当你在那里设置其他东西的时候,除非你明确地把它放进去,否则它不会被添加。尽量避免使用环境变量,并使用'-cp'或可运行jar文件或IDE。环境往往会泄漏到不需要它的应用程序中,并将其搞乱。 – Thilo 2012-03-11 09:10:29

+0

有道理。我将继续使用环境变量进行开发。 '.bashrc'的好处在于它只修改当前用户的环境变量。对于产品代码,我将创建一个使用'-classpath'选项来显式设置类路径的shell脚本。 =) – 2012-03-11 09:16:36