线程“main”中的异常java.lang.NoClassDefFoundError:rx / Observable $ OnSubscribe

时间:2017-05-29 05:14:13

标签: java

我创建了一个名为RxJava的项目来演示RxJava的API的使用,下面是java文件的内容。

package com.limx.reactive;

import rx.Observable;
import rx.Subscriber;



public class CreateDemo {

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {

        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> observer) {
                try {
                    if (!observer.isUnsubscribed()) {
                        for (int i = 1; i < 5; i++) {
                            observer.onNext(i);
                        }
                        observer.onCompleted();
                    }
                } catch (Exception e) {
                    observer.onError(e);
                }
            }
         } ).subscribe(new Subscriber<Integer>() {
                @Override
                public void onNext(Integer item) {
                    System.out.println("Next: " + item);
                }

                @Override
                public void onError(Throwable error) {
                    System.err.println("Error: " + error.getMessage());
                }

                @Override
                public void onCompleted() {
                    System.out.println("Sequence complete.");
                }
            });
    }
}

然后我用

编译
limxtop@IdeaPad:~/test/RxJava$ javac -d ./bin -classpath ~/libs/rxjava-1.3.1-SNAPSHOT.jar src/com/limx/reactive/CreateDemo.java 

编译成功后,bin目录中生成了一些coressponding类文件。

但是当我用

执行类文件时
limxtop@IdeaPad:~/test/RxJava$ java -classpath ./bin com.limx.reactive.CreateDemo

发生异常

Exception in thread "main" java.lang.NoClassDefFoundError: rx/Observable$OnSubscribe
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2688)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3035)
    at java.lang.Class.getMethod0(Class.java:3005)
    at java.lang.Class.getMethod(Class.java:1771)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: rx.Observable$OnSubscribe
    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)
    ... 7 more

似乎在“Observable”类中找不到内部类“OnSubscribe”,对吧?但为什么以及如何解决它?

/ **********************添加更多问题**************** /

limxtop@IdeaPad:~/test/RxJava$ java -classpath ~/libs/rxjava-1.3.1-SNAPSHOT.jar:./bin/ com.limx.reactive.CreateDemo
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.

上面的命令工作成功,但现在我还有进一步的问题。

  1. 异常说它找不到Observable $ OnSubscribe的定义而不是Observable,这意味着Observable类已经解析,那么为什么需要rxjava-1.3.1-SNAPSHOT.jar?

    < / LI>
  2. 类路径的顺序是否应与导入链一致?否则,更改订单时如何解释它不起作用。

  3. 这是bin目录中的文件:

    limxtop@IdeaPad:~/test/RxJava/bin/com/limx/reactive$ ll
    total 20
    drwxrwxr-x 2 limxtop limxtop 4096 May 29 13:03 ./
    drwxrwxr-x 3 limxtop limxtop 4096 May 29 13:03 ../
    -rw-rw-r-- 1 limxtop limxtop 1226 May 29 13:03 CreateDemo$1.class
    -rw-rw-r-- 1 limxtop limxtop 1062 May 29 13:03 CreateDemo$2.class
    -rw-rw-r-- 1 limxtop limxtop  630 May 29 13:03 CreateDemo.class
    

1 个答案:

答案 0 :(得分:1)

您需要将rxjava-1.3.1-SNAPSHOT.jar添加到类路径中,因为它包含RxJava(Observable等)类:

java -classpath ~/libs/rxjava-1.3.1-SNAPSHOT.jar:./bin com.limx.reactive.CreateDemo

如果您使用的是Windows,则需要使用;代替:作为类路径分隔符。

<强>更新

请注意,~/扩展到您的HOME目录(由shell完成,而不是由java可执行文件完成)当它出现在{{1的中间某处}时不起作用}} 宣言。您最好使用完全合格的路径或类似-classpath的路径,这样更可靠。