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
уже в моем пути к классам. Я хотел бы понять, в чем проблема, чтобы я знал, что происходит на самом деле за кулисами.
'JavaScript-файл с именем HelloWorld.java' o_O. Rhino выполняет файлы 'js' (javascript), а не' Java'. Чтобы запускать программы 'Java', не нужно иметь Rhino. – kirilloid
@kirilloid: для запуска классов Java, скомпилированных Rhino, требуется библиотека времени выполнения Rhino. – Thilo
@Thilo Разве Rhino компилирует 'js' в' Java'? – kirilloid