2015-02-06 3 views
1

여기에서 이와 같은 질문을 보았습니다. 그러나 내 상황과 관련된 질문을 찾을 수 없으므로, 낡은 질문 인 경우 죄송합니다.NoClassDefFoundError Java (잘못된 이름)

~/JavaClasses/myname/utils에있는 패키지 myname.utils의 일부인 클래스 P가 있습니다. ~/JavaClasses/myname/practice에있는 다른 클래스 인쇄가 패키지의 일부로 선언되어 있지는 않습니다. 클래스 인쇄가 클래스 P를 가져옵니다.이 두 클래스 모두 ~/JavaClasses 디렉토리에서 정상적으로 컴파일됩니다. 그러나 나는 다음과 같은 오류를 얻을이

~/JavaClasses$ java myname/practice/Printing 

같은 컴파일 된 클래스 인쇄를 실행하려고 할 때 : 패키지 이름을 사용하지 않기 때문에

Exception in thread "main" java.lang.NoClassDefFoundError: myname/practice/Printing (wrong name: Printing) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 
+0

'java myname.practice.Printing'이어야합니다. myname.practice라는 패키지에 있다고 가정합니다. – BackSlash

+0

P 클래스의 복사본을 가져 와서 패키지에 넣고 처음에 패키지에 포함 된 것으로 표시하기 위해'package' 문을 추가하십시오. 그러면 모든 것이 잘 작동합니다. –

+0

이것에 대한 소스 코드가 있습니까 ?? – dcsohl

답변

0

이입니다. 예, java가 오류를 표시하고 클래스의 패키지 이름을 찾을 수 없으면 /을 사용합니다. 그러나 그 (것)들은 .로 대체되어야합니다. 패키지 이름의 일부는 항상 마침표로 구분되고 절대로 슬래시가 사용되지 않기 때문입니다. 패키지가 있다면 foo.bee. 그리고 나는 그것을 클래스 데프하지 오류에 대한 불평 것이다

java foo/bee

을 시도하지만 경우,

java foo.bee

그것은 현재 실행하고 모든 것이 실행하려고 할 때.

1

오류 myname.utils.P 클래스에 관련 아니라 인쇄 클래스가 어떤 패키지 정의가 없기 때문에 발생합니다. 즉, 클래스의 실제 전체 이름은 이지만 ~/JavaClasses 폴더에서 java 명령을 실행하면 인쇄 클래스의 전체 이름은 myname.practice.Printing입니다.

1) 인쇄 클래스 내부의 myname.practice 패키지 (나는이 일을 제안)

이 선언)을 myname.practice 폴더 추가 :

는이 문제를 해결하기 위해 2 가지 옵션이 있습니다

~/JavaClasses$ java -cp myname.practice:. Printing 

. 현재 디렉토리를 표시합니다, 당신은 여전히 ​​참조하지만 수 있도록이 필요합니다 :이 방법으로 클래스 경로에 nce myname.utils.P ~/JavaClasses 폴더에서 클래스.

사이드 노트. 컴파일 할 때 javac를 시작할 때 classpath를 지정하지 않고 현재 사용되는 폴더를 지정하지 않았기 때문에 오류가 발생하지 않습니다. 이런 식으로, myname.utils.P는 모든 클래스에 의해 문제없이 인쇄 할 수 있습니다.