2012-03-11 12 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クラスファイルを実行しようとしました。私はjava.lang.NoClassDefFoundErrorがスローされる原因となったかを理解しようとした、と私は、このblog postで読んだから、私はクラスがコンパイル時に存在した場合java.lang.NoClassDefFoundErrorがスローされることを学んだ

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クラスパスでは使用できません。

だから私は、問題が何であるかを確認するために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仮想マシンがそれを見つけることができない理由はありません。これは私が混乱しているところです。私はここからどこに行くべきか、この問題を解決するために何をすべきかわかりません。

私は次のようにHelloWorldのインスタンスでexecメソッドを呼び出すためのRhinoを起動した場合、私はJavaクラスファイルを実行できることが判明:

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

しかし、私はJavaクラスファイルを実行したいと思いますjs.jarファイルが既に自分のクラスパスにあるので、java HelloWorldコマンドを直接使用してください。私は問題が何であるかを理解したいので、実際に何が起こっているのかを知ることができます。

+1

'HelloWorld.java'という名前のJavaScriptファイルo_O。 Rhinoは 'Java'ファイルではなく' js'(javascript)ファイルを実行します。 'Java'プログラムを走らせるために、Rhinoを持つ必要はありません。 – kirilloid

+0

@kirilloid:RhinoでコンパイルされたJavaクラスを実行するには、Rhinoランタイムライブラリが必要です。 – Thilo

+0

@Thilo Rhinoは 'js'を' Java'にコンパイルしますか? – kirilloid

答えて

3

クラスファイルが(js.jarと同様に)クラスパスにありますか?

(そうでない場合は、カレントディレクトリに-cp build;js.jarのようなものをHelloWorld.classをすると仮定した場合)

java -cp .;js.jar HelloWorld 

を試してみてください。

+0

私は問題が何かを知りました。私の 'HelloWorld'クラスはクラスパスにありませんでした。そこで私の '.bashrc'の次の行を、' export CLASSPATH =/usr/share/rhino/js.jar:$ HOME/class'の変更を反映するように更新しました。次に、 'HelloWorld.class'ファイルを' $ HOME/class'に移動しました。それが問題を解決しました。 'class'ディレクトリから' java HelloWorld'を実行したとき、エラーなしで出力が表示されました。ご協力ありがとうございました。私は明示的にJava仮想マシンが私の 'HelloWorld.class'ファイルを見つけることができませんでした。私は何が起こったのか分からない。 –

+0

現在のディレクトリがクラスパスにあるとは限りません。環境変数を避け、 '-cp'やrunnable jarファイルやIDEを使うようにしてください。環境は、アプリケーションを必要としないアプリケーションに流出し、アプリケーションを混乱させる傾向があります。 – Thilo

+0

意味があります。私は開発目的で環境変数を使用し続けます。 '.bashrc'の良い点は、現在のユーザの環境変数のみを変更することです。プロダクションコードでは、クラスパスを明示的に設定する '-classpath'オプションを使用するシェルスクリプトを作成します。 =) –

関連する問題