我使用以下代码收集推文。编译时没有任何错误。但是当我编译这个程序时,它显示了异常。
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这样的包。我能做什么?请帮帮我。
答案 0 :(得分:1)
您的项目是如何设置的?您是从命令行还是在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
中,通常位于src
或src/main/java
目录下,以及您的IDE(例如Eclipse)或IDEA)将该目录中的所有源文件构建为具有所有.class
文件的并行输出目录结构。听起来您可能正在从命令行自己构建所有内容,当然您可以这样做,但是您必须考虑类的完全限定名称以及Java期望找到它的位置。
例如,您可以将源放入适当的目录并在调用javac
时键入它的完整路径,或者您可以使用-d
切换到javac
来告诉它放置.class
文件的位置,然后在运行时使用类的完全限定名称:
java com.crowley.simplestream.SimpleStream