2012-02-09 2 views
0

나는 다음과 같은 오류 얻을 Test.class라는 실행 : 여기NoSuchMethodError 및 NoClassDefFoundError의 원인은 무엇입니까?

Exception in thread "main" java.lang.NoSuchMethodError: ml.Temp.<init>(Ljava/lang/String;II)V 
    at test.main(test.java:11) 

그리고 내가 Temp.class을 포함하는 jar 파일이 기본적으로 test.java

import java.io.*; 
import ml.*; 

class test 
{ 
     public static void main(String[] args) throws FileNotFoundException, IOException 
     { 
       String filename = "input"; 

       Temp id = new Temp(filename, 6, 100); 
        id.someFunction();   
     } 
} 

코드입니다 (온도입니다 내가 작성하고 ml 패키지 아래에있는 라이브러리 파일). Temp에는 이러한 세 개의 인수와 public someFunction을 사용하는 생성자가 있습니다.

이 방법이 도움이되는지 잘 모르겠지만 컴파일하는 동안 jar 파일의 클래스 경로가 포함되었습니다. 내가 Test.class라는의 실행 중에 jar 파일의 클래스 경로를 포함 할 때 나는 다음과 같은 얻을

Exception in thread "main" java.lang.NoClassDefFoundError: test 
Caused by: java.lang.ClassNotFoundException: test 
    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: test. Program will exit. 

편집 :

가 나는 다음과 같이 컴파일하는 데 도움이 경우 (ml.jar 및 test.java이에 당신이 경로에 test.class 상주에서 명령 java -cp <path-to-ml.jar> test를 실행해야합니다

javac -cp ml.jar test.java 
+0

어떻게 구축하고 실행합니까? –

+0

첫 번째 오류가 발생하면 방금 Java 테스트를 수행했습니다. java -cp "ml.jar"테스트를 수행하면 두 번째 오류가 발생합니다. – Hari

답변

1

같은 디렉토리).

NoSuchMethodError EDIT는 서명 (String, int, int)와 ml.ID3 (안 Temp!)의 생성자를 사용하려는 test 클래스의 라인 (11)에 그 존재하지 않음을 나타냅니다. 클래스 패스에 없다는 의미는 아니기 때문에 NoClassDefFoundError이됩니다.

반면에 NoClassDefFoundError: testtest이 더 이상 clsspath에 없다는 것을 의미합니다. 항아리를 클래스 패스에 추가하면 실제로 NoClassDefFoundError: test을 얻으려고하면 이 아니므로 클래스 경로에서 test이 사라집니다. 다른 실수로 작업했을 가능성이 큽니다. 2

편집은 어쩌면 생성자는 개발 환경에서 사용되는 ID3에 존재하지만 그것은 분명히 당신의 런타임 환경에 존재하지 않습니다. 그것은 제 3 자 jat 경우, 당신은 그 항아리의 두 버전, 하나는 런타임에 dev에 사용되는 다른 일이 일어날 수도 있습니다. 또는 둘 다 런타임 환경에 표시 될 수도 있지만 생성자 도구 우선 순위가없는 환경에 표시 될 수도 있습니다.

+0

예, test.class가있는 곳에서 실행했습니다. 아니면 Temp.class를 의미할까요? – Hari

+0

아니요. Temp.class는 'path-to-ml.jar'에 의해 참조되는 jar에 있어야합니다. – yair

+0

예, 그 경우 - test.class와 동일한 경로에서 실행합니다. – Hari

1

소스 코드가 없이는 어떤 일이 발생했는지 정확히 알기는 어렵지만, 라이브러리와 프로젝트를 사용하고있는 프로젝트가 동기화되지 않은 것처럼 보입니다. 라이브러리/프로젝트의 모든 메소드의 서명을 변경 했습니까? 모든 것을 다시 컴파일 한 다음 클래스 test이 다시 컴파일 한 라이브러리의 최신 버전을 사용하고 있는지 확인하려면 public으로 선언하십시오.내가 당신을하고 전체 과정을 거쳐야 척 하겠어 http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/

1

: NoSuchMethodError 등을 읽는 방법에

더 유용한 정보는 여기 좋은 문서에서 찾을 수 있습니다

- 1 라이브러리 . 나는 workspace이라는 디렉토리에있다. 그 안에는 ml이라는 디렉토리를 만들었습니다. 지금 라이브러리 클래스를 컴파일하고 라이브러리 항아리를 만들려고하고

package ml; 

public class Temp 
{ 
    public Temp(String filename, int arg1, int arg2) 
    { 
     //do something 
    } 

    public void someFunction() 
    { 
     //do something else 
     System.out.println("look left!"); 
    } 
} 

:
ml 디렉토리 내부에서 나는 예를 위해 다음을 포함, Temp.java라는 새로운 파일을 만들었습니다. 먼저 나는 ml 디렉토리 내에

javac ./Temp.java 

을 실행하여 컴파일합니다. 그럼 난 workspace 디렉토리 및 실행까지 하나의 디렉토리를 이동하여 라이브러리를 항아리 :

jar cf ml.jar ml/ 

2 - 프로그램을. 이제 workspace 디렉토리에 Test.java 파일을 만듭니다. 파일에 다음 내용이 포함되어 있습니다.

import java.io.*; 
import ml.*; 

public class Test 
{ 
    public static void main(String[] args) throws FileNotFoundException, IOException 
    { 
     String filename = "input"; 

     Temp id = new Temp(filename, 6, 100); 
     id.someFunction(); 
    } 
} 

3 - 결과. 이제 테스트 프로그램을 컴파일하고 실행합니다. workspace 디렉토리 내부 나는 실행

javac -cp ./:ml.jar ./Test.java 

내가 마지막으로 workspace 디렉토리 내에서 다음 명령을 실행하여 프로그램을 실행할 수 있습니다

look left! 

: 출력을 보여줄 것이다

java -cp ./:ml.jar Test 

이게 도움이 되길 바란다.

관련 문제