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.");
}
});
}
}
それから私は、後のコンパイルに成功binディレクトリに生成されたいくつかのcoresspondingクラスファイルがあります
[email protected]:~/test/RxJava$ javac -d ./bin -classpath ~/libs/rxjava-1.3.1-SNAPSHOT.jar src/com/limx/reactive/CreateDemo.java
してコンパイルします。
しかし、私は
[email protected]:~/test/RxJava$ java -classpath ./bin com.limx.reactive.CreateDemo
とクラスファイルを実行すると、例外はそれは右、クラス「観察可能」で「OnSubscribe」内部クラスを見つけることができないようです
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
起こりますか?なぜそれを解決するのか?
/********************** ****************/
さらに質問を追加[email protected]:~/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.
上記のコマンドはうまくいきましたが、今私はさらに疑問があります。
例外は、それが観察クラスが解決されることを意味している観察可能$ OnSubscribeの定義ではなく、観測を見つけることができないと言われ、なぜrxjava-1.3.1-SNAPSHOT.jarには必要?
クラスパスの順序はインポートチェーンと一致する必要がありますか?それ以外の場合は、注文を変更するときにそれを説明する方法は機能しません。ここ
は、binディレクトリ内のファイルです:
[email protected]:~/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
'-classpath bin/* 'を使ってみてください –
私は試しましたが、まだ動作しません。 limxtop @ IdeaPad:〜/ test/RxJava $ java -classpath ./bin/* com.limx.reactive.CreateDemo エラー:メインクラスcom.limx.reactive.CreateDemoを見つけられないかロードできませんでした – Saint
実際には-classpath bin/*間違っている。説明と詳細については、http://docs.oracle/の「クラスパスのワイルドカードについて」を参照してください。 – Saint