6

私は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を初めて使用するので、おそらく簡単な解決策がありますが、それを見つけることができません。Ubuntu11.04でSunJava1.664ビットを使用しています。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();
    }
}
4

4 に答える 4

10

クラスパスは、使用している外部ライブラリのディレクトリと、それ自体を実行しようとしているクラスの両方を指している必要があります。これを試して:

ウィンドウズ:

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
于 2012-05-19T10:55:01.340 に答える
1

これ

java -cp /usr/share/java/scribe-1.3.0.jar FacebookProg 

FacebookProgクラスをコンパイルするのではなく、実行していることを意味します。

除外する-cp ...と、重要なクラスパスが除外されるため、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がありません。2番目のjarへのパスが間違っています。試す

export CLASSPATH="/usr/share/java/scribe-1.3.0.jar"; java FacebookProg     

また、瓶が実際にに配置されていることを確認してください/usr/share/java/scribe-1.3.0.jar

于 2012-05-19T10:50:21.363 に答える
1
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

于 2012-05-19T10:54:10.483 に答える
0

あなたのプログラムのディレクトリは

$ 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
于 2012-05-19T10:51:00.000 に答える