Невозможно выполнить файл JavaScript, скомпилированный с помощью Rhino JavaScript Compiler - PullRequest
4 голосов
/ 11 марта 2012

Хорошо, поэтому я создал файл JavaScript с именем HelloWorld.js со следующим содержимым:

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

Теперь я скомпилировал его с помощью JavaScript-компилятора Rhino, используя следующую команду (файл js.jarв моем classpath):

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, и из того, что я прочитал в этом сообщении в блоге , я узнал, чтоjava.lang.NoClassDefFoundError генерируется, если класс присутствовал во время компиляции, но не был доступен в Java classpath во время выполнения.

Поэтому я запустил команду 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 Ответ

3 голосов
/ 11 марта 2012

Вы уверены, что файл класса находится в пути к классам (а также js.jar)?

Попробуйте

java -cp .;js.jar HelloWorld

(при условии HelloWorld.class в текущем каталоге, иначе что-то вроде -cp build;js.jar).

...