gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:29:07 26 4
gpt4 key购买 nike

我创建了一个名为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目录下生成了相应的class文件。

但是当我用

执行类文件时
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?

  2. classpath的顺序要和导入链一致吗?不然换顺序怎么解释都不行。

这是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

最佳答案

您还需要将 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 可执行文件完成)在发生在某处时不起作用-classpath 声明的中间。您最好使用完全限定的路径或类似 ${HOME}/libs/rxjava-1.3.1-SNAPSHOT 的路径,这样更可靠。

关于java - 线程 "main"java.lang.NoClassDefFoundError : rx/Observable$OnSubscribe 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44235010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com