【问题标题】:java "ClassNotFoundException" errorjava“ClassNotFoundException”错误
【发布时间】:2012-05-19 10:45:54
【问题描述】:

我是 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();
    }
}

【问题讨论】:

  • 我完全是 Java 菜鸟,在 javacjava 命令的选项之间搞混了。我的问题是我在编译时使用了-cp 标志,但在执行时没有使用。当我在两者上都使用该选项时,我的代码运行良好:javac -cp .:/my/full/path/myjar.jar test.java; java -cp .:/my/full/path/myjar.jar test

标签: java classpath classnotfoundexception scribe


【解决方案1】:

类路径必须指向您正在使用的外部库的目录和您尝试运行的类。试试这个:

窗户:

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

【讨论】:

  • 是的,这对我有用。虽然“usr/”前面应该有一个斜杠开始。这里:java -cp .:/usr/share/java/scribe-1.3.0.jar FacebookProg
  • 不客气。我可以从程序员的角度告诉你,通过经验学习比从书本和教程中获得的知识更有价值。我很高兴它今天开始使用。至于 usr 之前的斜线,我对 linux 目录结构不太熟悉,所以我很抱歉。
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    这个

    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     
    

    另外,请确保 jar 确实位于 /usr/share/java/scribe-1.3.0.jar

    【讨论】:

    • 这个答案值得更多的支持。
    【解决方案4】:

    假设你的程序目录是

    $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
    

    【讨论】:

      猜你喜欢
      • 2013-02-01
      • 2020-12-03
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2014-09-09
      相关资源
      最近更新 更多