2012-03-11 3 views
4

좋아를 사용하여 컴파일 된 자바 스크립트 파일을 실행할 수 없습니다, 그래서 다음과 같은 내용으로 HelloWorld.js라는 이름의 자바 스크립트 파일을 생성 : 이제이 코뿔소는 자바 스크립트 컴파일러

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

를, 내가 사용하는 코뿔소는 자바 스크립트 컴파일러를 사용하여 컴파일 다음 명령합니다 (js.jar 파일 내 클래스 경로에) : 그것은 자바 스크립트 파일을 컴파일하고 예상대로 자바 클래스 파일을 생성

java org.mozilla.javascript.tools.jsc.Main HelloWorld.js 

. 그런 다음 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 Virtual Machine이 찾을 수없는 이유가 없어야합니다. 이것은 내가 혼란스러워하는 곳입니다. 여기에서 어디로 가야할지,이 문제를 해결하기 위해 무엇을해야할지 모릅니다.

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

을 그러나 나는 자바 클래스 파일을 실행하고 싶습니다 :

나는 다음과 같이 내가 HelloWorld의 인스턴스에 exec 메소드를 호출하는 코뿔소를 호출하면 내가 자바 클래스 파일을 실행할 수 있습니다 발견 js.jar 파일이 이미 내 클래스 경로에 있기 때문에 java HelloWorld 명령을 직접 사용하십시오. 나는 그 문제가 무엇인지 이해하고 싶다. 그래서 그 뒤에서 실제로 일어나는 일을 알고있다.

+1

'HelloWorld.java' o_O라는 JavaScript 파일. Rhino는'Java '파일이 아닌'js' (javascript) 파일을 실행합니다. 'Java' 프로그램을 실행하기 위해서는 Rhino가 필요하지 않습니다. – kirilloid

+0

@kirilloid : Rhino에서 컴파일 한 Java 클래스를 실행하려면 Rhino 런타임 라이브러리가 필요합니다. – Thilo

+0

@Thilo Rhino가'js'를'Java'로 컴파일합니까? – kirilloid

답변

3

클래스 파일이 js.jar뿐 아니라 클래스 경로에 있는지 확인 하시겠습니까?

java -cp .;js.jar HelloWorld 

이 (그렇지 않으면 뭔가 -cp build;js.jar처럼, 현재 디렉토리에 HelloWorld.class 가정)보십시오.

+0

문제점이 무엇인지 알아 냈습니다. 내'HelloWorld' 클래스는 classpath에 없습니다. 그래서'export CLASSPATH =/usr/share/rhino/js.jar : $ HOME/class'의 변경을 반영하기 위해'.bashrc'에서 다음 행을 업데이트했습니다. 그런 다음,'HelloWorld.class' 파일을'$ HOME/class'로 옮겼습니다. 그것은 그 문제를 해결했습니다. 'class' 디렉토리에서'java HelloWorld'를 실행했을 때 에러없이 출력을 보여주었습니다. 도와 줘서 고마워. Java Virtual Machine이 명시 적으로 실행하려고 할 때 왜 내 HelloWorld.class 파일을 찾을 수 없습니까? 나는 무슨 일이 일어 났는지 이해하지 못한다. –

+0

현재 디렉토리가 반드시 클래스 경로에있는 것은 아닙니다. 내 생각에, 당신이 다른 것들을 설정할 때 명시 적으로 넣지 않으면 추가되지 않을 것입니다. 환경 변수를 피하고'-cp' 나 runnable jar 파일이나 IDE를 사용하십시오. 환경은 필요하지 않은 응용 프로그램으로 누출되어 엉망이되는 경향이 있습니다. – Thilo

+0

의미가 있습니다. 개발 목적으로 환경 변수를 계속 사용하겠습니다. '.bashrc '에 대한 좋은 점은 현재 사용자의 환경 변수 만 수정한다는 것입니다. 프로덕션 코드의 경우 클래스 패스를 명시 적으로 설정하기 위해'-classpath' 옵션을 사용하는 쉘 스크립트를 만들 것입니다. =) –