This question already has an answer here:
java.lang.NoClassDefFoundError Main (Wrong Name : com/leslie/quiz/Main)

(1个答案)


5年前关闭。





我使用以下代码来收集推文。编译时没有任何错误。但是,当我编译该程序时,它会显示异常。

package com.crowley.simplestream;

import twitter4j.FilterQuery;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.User;
import twitter4j.conf.ConfigurationBuilder;
import twitter4j.StallWarning;

public class SimpleStream {
    public static void main(String[] args) {
        ConfigurationBuilder cb = new ConfigurationBuilder();

        cb.setDebugEnabled(true);

        cb.setOAuthConsumerKey("*********************");
        cb.setOAuthConsumerSecret("*******************");
        cb.setOAuthAccessToken("********************");
        cb.setOAuthAccessTokenSecret("*********************");

        TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();

        StatusListener listener = new StatusListener() {
            @Override
            public void onException(Exception arg0) {
                // TODO Auto-generated method stub

            }
            @Override
            public void onDeletionNotice(StatusDeletionNotice arg0) {
                // TODO Auto-generated method stub

            }
            @Override
            public void onScrubGeo(long arg0, long arg1) {
                // TODO Auto-generated method stub

            }
            @Override
            public void onStatus(Status status) {
                User user = status.getUser();

                // gets Username
                String username = status.getUser().getScreenName();
                System.out.println(username);
                String profileLocation = user.getLocation();
                System.out.println(profileLocation);
                long tweetId = status.getId();
                System.out.println(tweetId);
                String content = status.getText();
                System.out.println(content +"\n");

            }

            @Override
            public void onTrackLimitationNotice(int arg0) {
                // TODO Auto-generated method stub

            }
           @Override
           public void onStallWarning(StallWarning warning){
           }

        };
        FilterQuery fq = new FilterQuery();

        String keywords[] = {"ireland"};

        fq.track(keywords);

        twitterStream.addListener(listener);
        twitterStream.filter(fq);

    }
}


运行此程序时遇到的异常如下。

Exception in thread "main" java.lang.NoClassDefFoundError: SimpleStream (wrong name: com/crowley/simplestream/SimpleStream)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:472)


我使用了Jwitter4j。但是它不包含ClassLoader.java之类的软件包。我能做什么?请帮我。

最佳答案

您的项目如何设置?您是从命令行还是在IDE中编译并运行它?如果您有一个名为SimpleStream的类,并且该类的顶部带有package com.crowley.simplestream;语句,则com.crowley.simplestream.SimpleStream是该类的完全限定名称。默认情况下,javac编译器将在当前目录中发出.class文件,但是它希望在运行该类时在com/crowley/simplestream/SimpleStream中找到该类。

通常,您将com.crowley.simplestream.SimpleStream的源代码保存在项目中的文件com/crowley/simplestream/SimpleStream.java中,通常在srcsrc/main/java目录下,并且您的IDE(例如Eclipse或IDEA)将在其中构建所有源文件。目录到包含所有.class文件的并行输出目录结构中。听起来您似乎可以通过命令行自己构建所有内容,当然可以这样做,但是您必须考虑类的完全限定名称以及Java希望在哪里找到它。

例如,您可以将源放置在适当的目录中,并在调用javac时键入源的完整路径,或者可以使用-d切换到javac告诉它将.class文件放置在何处,然后您将在运行类时使用该类的完全限定名称:


java com.crowley.simplestream.SimpleStream

07-25 21:33