Search code examples
javaclassnotfoundexceptiontwitter4jtwitter-streaming-api

Twitter4j streaming api call throwing class not found exception


I am writing a utility class using twitter4j for multiple purpose. I am able to search tweets based on Hashtags, location etc but Streaming API is not working for me.

I have written a class with main method after following a blog as follows but I am getting class not found error.I am new to java.

    package mytweetapp;

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

public class Stream {
    public static void main(String[] args) throws TwitterException {

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
        .setOAuthConsumerKey("*****")
        .setOAuthConsumerSecret(
                "*******")
        .setOAuthAccessToken(
                "*****")
        .setOAuthAccessTokenSecret(
                "*****");

TwitterStreamFactory tf = new TwitterStreamFactory(cb.build());
TwitterStream twitter = tf.getInstance();

StatusListener listener = new StatusListener() {

    public void onStatus(Status status) {
        System.out
                .println("@" + status.getUser().getScreenName() + " - " + status
                        .getText());
    }

    public void onDeletionNotice(
            StatusDeletionNotice statusDeletionNotice) {
        System.out
                .println("Got a status deletion notice id:" + statusDeletionNotice
                        .getStatusId());
    }

    public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
        System.out
                .println("Got track limitation notice:" + numberOfLimitedStatuses);
    }

    public void onScrubGeo(long userId, long upToStatusId) {
        System.out
                .println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
    }

    public void onException(Exception ex) {
        ex.printStackTrace();
    }

    @Override
    public void onStallWarning(StallWarning arg0) {
        // TODO Auto-generated method stub

    }
};

FilterQuery fq = new FilterQuery();
String keywords[] = { "Mango", "Banana" };

fq.track(keywords);

twitter.addListener(listener);
twitter.filter(fq);
}

Error

    Exception in thread "main" java.lang.NoClassDefFoundError: twitter4j/internal/http/HttpClientWrapperConfiguration
    at twitter4j.TwitterStreamFactory.<clinit>(TwitterStreamFactory.java:40)
    at mytweetapp.Stream.main(Stream.java:23)
Caused by: java.lang.ClassNotFoundException: twitter4j.internal.http.HttpClientWrapperConfiguration
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 2 more

Solution

  • My current hypothesis is that the problem is because of mixing core and stream jars of different versions (so e.g. TwitterStreamFactory from stream-3.0.3 expects HttpClientWrapperConfiguration to be available on your classpath but in 4.0.4 it is no longer included. Please try having those of the same version included (and only one version of lib, so stream-3 and stream-4 being included together is no-no). If that won't work - share the whole project somewhere for more context.

    As for what classpath is you can google, or read up e.g. here What is a classpath?