자바 "ClassNotFoundException" 오류
-
11-12-2019 - |
문제
저는 Java 프로그래밍이 처음인데 매우 악의적인 오류 "ClassNotFoundException" 오류가 발생합니다.
이상한 점은 컴파일이 잘 된다는 것입니다.
java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
하지만 실행하려고 하면 다음과 같은 오류가 발생합니다.
steve@steve-ThinkPad-T61:~/facebook$ java FacebookProg
Exception in thread "main" java.lang.NoClassDefFoundError:
org/scribe/builder/ServiceBuilder
at FacebookProg.main(FacebookProg.java:8)
Caused by: java.lang.ClassNotFoundException: org.scribe.builder.ServiceBuilder
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
... 1 more
온라인으로 확인해 보니 Java가 컴파일 타임에 찾을 수 있었던 라이브러리를 런타임에 찾을 수 없는 것 같습니다.따라서 다음 변형을 시도했습니다.
java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
java -cp /usr/share/java/ FacebookProg
export CLASSPATH="/usr/share/java"; java FacebookProf
export CLASSPATH="/usr/share/java/usr/share/java/scribe-1.3.0.jar"; java FacebookProg
StackOverflow와 Google에서 여러 곳을 확인했지만 여전히 이유를 알 수 없습니다.저는 Java를 처음 사용하기 때문에 간단한 해결책이 있을 수 있지만 찾을 수 없습니다.Ubuntu 11.04에서 Sun Java 1.6 64비트를 사용하고 있습니다.scribe-1.3.0.jar 파일은 "/usr/share/java"에 있으며, 내 생각에는 이 곳이 Java 패키지를 넣는 표준적인 장소입니다.
베어본 코드는 여기에 있습니다(중요한 경우).
import org.scribe.builder.*;
import org.scribe.builder.api.*;
import org.scribe.oauth.*;
public class FacebookProg {
public static void main (String args[]) {
OAuthService service = new ServiceBuilder()
.provider(FacebookApi.class)
.apiKey("blah_blah")
.apiSecret("blah_blah")
.build();
}
}
해결책
CLASSPATH는 사용중인 외부 라이브러리의 디렉토리와 실행하려는 클래스를 가리켜 야합니다.이것을 시도하십시오 :
Windows :
java -cp .;/usr/share/java/scribe-1.3.0.jar FacebookProg
.
Linux :
java -cp .:/usr/share/java/scribe-1.3.0.jar FacebookProg
.
그런데 컴파일하기 위해 다음을 실행해야합니다.
javac -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
. 다른 팁
프로그램의 디렉토리가 이라고 가정합니다.
$ home
$ home / lib / *. jar
다음과 같은 스크립트를 작성할 수 있습니다.
for file in "$HOME/lib/*.jar"
do
if [ -f $file ]
then
CLASSPATH=$CLASSPATH:$file
else
echo ignore $file
fi
done
java -cp $CLASSPATH FacebookProg
. java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
.
동일한 디렉토리에서 facebookprog.class를 컴파일하면이 기능이 잘 작동해야합니다.java -cp /usr/share/java/scribe-1.3.0.jar:/locationOfFacebookProg.class directory/ FacebookProg
를 시도 할 수 있습니다
이것
java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
당신이 실행하고 있음을 의미 FacebookProg
클래스, 컴파일하지 않음.
당신이 떠나면 -cp ...
out, 중요한 클래스 경로를 벗어나므로 JVM이 클래스를 찾을 수 없습니다. FacebookProg
필요합니다.
컴파일하려면 다음이 필요합니다.
javac -cp /usr/share/java/scribe-1.3.0.jar FacebookProg.java
(참고 javac
, 대신에 java
컴파일러를 호출하기 위해)
달리는 방법은 이미 알고 있습니다.
또한 다음 줄에 오류가 있습니다.
export CLASSPATH="/usr/share/java"; java FacebookProf
export CLASSPATH="/usr/share/java/usr/share/java/scribe-1.3.0.jar"; java FacebookProg
첫 번째 철자 오류 FacebookProg
클래스 경로에 필요한 jar가 없으면 두 번째는 jar에 대한 잘못된 경로를 갖습니다.노력하다
export CLASSPATH="/usr/share/java/scribe-1.3.0.jar"; java FacebookProg
또한 항아리가 실제로 다음 위치에 있는지 확인하십시오. /usr/share/java/scribe-1.3.0.jar