2012-03-11 2 views
4

Alright, поэтому я создал файл 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, вызвав java HelloWorld. Тем не менее, генерируется следующее сообщение об ошибке:

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 отбрасывается, если класс присутствовал во время компиляции время, но не доступно в Javapathpath во время выполнения.

Так что я выполнил команду 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 не сможет ее найти. Здесь я смущен. Я не знаю, куда идти отсюда, и что делать, чтобы решить эту проблему.

я узнал, что я мог бы выполнить файл класса Java, если я вызван Rhino для вызова метода exec на примере HelloWorld следующим образом:

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

+0

@kirilloid: для запуска классов Java, скомпилированных Rhino, требуется библиотека времени выполнения Rhino. – Thilo

+0

@Thilo Разве Rhino компилирует 'js' в' Java'? – kirilloid

ответ

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'. Это решило проблему. Когда я выполнил 'java HelloWorld' из каталога' class', он показал мне результат без ошибок. Спасибо за помощь. У меня есть еще один вопрос: почему виртуальная машина Java не нашла мой файл HelloWorld.class, когда я явно пытался его выполнить? Я не понимаю, что произошло. –

+0

Текущий каталог не обязательно находится в пути к классам. Я думаю, что когда у вас есть другие вещи, они не будут добавлены, если вы явно не включите их. Попытайтесь избежать переменных окружения и используйте файлы '-cp' или runnable jar или IDE. Окружающая среда имеет тенденцию просачиваться в приложения, которые не нуждаются в ней, и испортить их. – Thilo

+0

Имеет смысл. Я буду продолжать использовать переменные среды для целей разработки. Хорошая вещь в '.bashrc' заключается в том, что она только изменяет переменные среды текущего пользователя. Для производственного кода я создам скрипт оболочки, который использует опцию '-classpath' для явного указания пути к классам. знак равно –

Смежные вопросы