Errore di Java "ClassNotFoundException"
-
11-12-2019 - |
Domanda
Sono nuovo alla programmazione Java e ricevo l'errore "CLASSNOTFOUNDEXCETOND" Errore molto malignato.
La cosa strana è che si compensa bene:
java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
.
Ma quando provo a eseguirlo, ottengo il seguente errore:
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
.
Ho controllato online e sembra che Java non riesca a trovare la Biblioteca in fase di runtime che è stato in grado di trovare a tempo di compilazione.Quindi ho provato le seguenti varianti:
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
.
Ho controllato diversi luoghi su Stackoverflow e Google e non riescono a capire il perché.Sono nuovo a Java, quindi probabilmente c'è una soluzione semplice, ma non riesco a trovarlo.Sto usando Sun Java 1.6 64 bit su Ubuntu 11.04.Il file Scribe-1.3.0.jar è in "/ usr / share / java" che, credo, è il posto canonico per mettere i pacchetti Java.
Il codice Barebones è qui (nel caso in cui è importante):
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();
}
}
. Soluzione
Il classpath deve puntare sia alla directory della libreria esterna che stai utilizzando e la classe che stai cercando di eseguire se stesso.Prova questo:
Windows:
java -cp .;/usr/share/java/scribe-1.3.0.jar FacebookProg
.
Linux:
java -cp .:/usr/share/java/scribe-1.3.0.jar FacebookProg
.
A proposito, per compilarlo, dovresti averlo eseguito:
javac -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
. Altri suggerimenti
Supponiamo che, la directory del tuo programma è
$ home
$ home / lib / *. JAR
È possibile scrivere uno script come:
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
.
Questo dovrebbe funzionare bene se hai compilato FacebookProg.class nella stessa directory.Puoi provare java -cp /usr/share/java/scribe-1.3.0.jar:/locationOfFacebookProg.class directory/ FacebookProg
Questo
java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg
.
significa che stai eseguendo la classe FacebookProg
, non la compilando.
Se si lascia il -cp ...
, si sta lasciando fuori il percorso di classe VITAL, quindi il JVM non riesce a trovare le classi che FacebookProg
richiede.
Per compilare, è necessario
javac -cp /usr/share/java/scribe-1.3.0.jar FacebookProg.java
.
(Nota il javac
, anziché java
per richiamare il compilatore)
Per correre, sai già come.
Inoltre, hai errori nelle linee follwoing:
export CLASSPATH="/usr/share/java"; java FacebookProf
export CLASSPATH="/usr/share/java/usr/share/java/scribe-1.3.0.jar"; java FacebookProg
.
Il primo Misspells FacebookProg
e non ha il barattolo richiesto sul classpath, il secondo ha il percorso sbagliato per il barattolo.Prova
export CLASSPATH="/usr/share/java/scribe-1.3.0.jar"; java FacebookProg
.
Inoltre, assicurati che il barattolo sia effettivamente situato in /usr/share/java/scribe-1.3.0.jar