我创建了一个名为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.
上面的命令工作成功,但现在我还有进一步的问题。
异常说它找不到Observable $ OnSubscribe的定义而不是Observable,这意味着Observable类已经解析,那么为什么需要rxjava-1.3.1-SNAPSHOT.jar?
< / LI>类路径的顺序是否应与导入链一致?否则,更改订单时如何解释它不起作用。
这是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
答案 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
的路径,这样更可靠。