While creating a hello world program I got this exception. Here is the code:
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
/**
* Created by veneet on 30/04/17.
*/
public class MainApp {
public static void main(String[] args) {
// This is where the exception occurs.
Observable<String> observable = Observable.create(e -> {
e.onNext("Hello World!");
e.onNext("Hello World!");
e.onNext("Hello World!");
e.onNext("Hello World!");
e.onNext("Hello World!");
e.onNext("Hello World!");
e.onComplete();
});
Observer<String> observer = new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println(s);
}
@Override
public void onError(Throwable e) {
System.err.println(e.getMessage());
}
@Override
public void onComplete() {
}
};
observable.subscribeOn(Schedulers.io());
observable.subscribe(observer);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
The build.gradle dependencies are like this:
dependencies {
compile "io.reactivex.rxjava2:rxjava:2.1.0"
// https://mvnrepository.com/artifact/org.reactivestreams/reactive-streams
compile group: 'org.reactivestreams', name: 'reactive-streams', version: '1.0.0.final'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
The complete stacktrace is like this(I think the first line is totally unrelated, but putting it to ensure):
objc[3423]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/bin/java (0x10b6dc4c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x10d0194e0). One of the two will be used. Which one is undefined.
Exception in thread "main" java.lang.NoClassDefFoundError: org/reactivestreams/Publisher
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at MainApp.main(MainApp.java:11)
Caused by: java.lang.ClassNotFoundException: org.reactivestreams.Publisher
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 13 more
Closing as repost of StackOverflow.
Please be patient on Stackoverflow.
@akarnokd I'm totally new java developer, and tried in eclipse Neon.3 Release (4.6.3). With the same exception. I have imported the rxjava-2.1.5.jar file of rxJava. My code is as below:
package rxjavaSample;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import io.reactivex.Observable;
public class Rxjava1Junit {
//@Test
public void test() {
Observable> t = createMyOb();
doSubscribe(t);
}
// create Observable
private Observable> createMyOb() {
return Observable.just(Arrays.asList(new Integer(2), new Integer(5)));
}
// subscribe
private void doSubscribe(Observable> objObservabled) {
objObservabled.subscribe(i -> i.stream().mapToInt(t -> t.intValue()).forEach(s -> System.out.println(s)));
}
}
So, what should I to do to fix this exception? Thanks for your help
Download and link the reactivestreams-1.0.1.jar from here for example.
@akarnokd Thanks for your quick response, In one word, the two .jar(
rxjava-2.1.5.jar,reactivestreams-1.0.1.jar) files should be referenced. Am I right?
Yes. RxJava 2 has that single dependency which would be resolved by a build system such as Gradle, or when you ask IntelliJ to add a Maven-based library dependency. With manual projects, you have to discover and download the dependencies yourself.
OK, I see. Thank you so much for your help.
@akarnokd Why RxJava build the reactivestreams as a separated library?
Reactive Streams is a separate industry standard library. It is maintained by different people in a different repository.
Most helpful comment
Download and link the
reactivestreams-1.0.1.jarfrom here for example.