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 和谷歌上的几个地方,但仍然无法弄清楚原因。我是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();
    }
}
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,第二个有错误的 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/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 回答