2017-05-29 4 views
2

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. 

上記のコマンドはうまくいきましたが、今私はさらに疑問があります。

  1. 例外は、それが観察クラスが解決されることを意味している観察可能$ OnSubscribeの定義ではなく、観測を見つけることができないと言われ、なぜrxjava-1.3.1-SNAPSHOT.jarには必要?

  2. クラスパスの順序はインポートチェーンと一致する必要がありますか?それ以外の場合は、注文を変更するときにそれを説明する方法は機能しません。ここ

は、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 
+0

'-classpath bin/* 'を使ってみてください –

+0

私は試しましたが、まだ動作しません。 limxtop @ IdeaPad:〜/ test/RxJava $ java -classpath ./bin/* com.limx.reactive.CreateDemo エラー:メインクラスcom.limx.reactive.CreateDemoを見つけられないかロードできませんでした – Saint

+0

実際には-classpath bin/*間違っている。説明と詳細については、http://docs.oracle/の「クラスパスのワイルドカードについて」を参照してください。 – Saint

答えて

1

それはRxJava(Observableなど)のクラス含まれているため、あなたも、あなたのクラスパスにrxjava-1.3.1-SNAPSHOT.jarを追加する必要があります。

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

Windowsで作業している場合は、:の代わりに;をクラスパスのセパレータとして使用する必要があります。

更新

それは-classpath宣言の途中のどこかで発生したとき(java実行可能でないシェルによって行われている)自分のホームディレクトリへ~/の拡大が動作しないことに注意してください。より信頼性の高い、完全修飾パスなどを使用してください。${HOME}/libs/rxjava-1.3.1-SNAPSHOT

+0

limxtop @ IdeaPad:〜/ test/RxJava $ java -classpath ./bin:~/libs/rxjava-1.3.1-SNAPSHOT.jar com/javase/7/docs/technotes/tools/windows/classpath.html limx.reactive.CreateDemo スレッドmainの例外java.lang.NoClassDefFoundError:rx/Observable $ OnSubscribe – Saint

+0

しかし、クラスパスの値の順序を変更すると、正常に動作してしまい、混乱します。 IdeaPad @ limxtop:〜/テスト/ RxJava $のJavaの-classpath〜/ libsに/ rxjava-1.3.1-SNAPSHOT.jarに:./ binに/ com.limx.reactive.CreateDemo 次:1 次:2次 :3 次へ:4 シーケンスが完了しました。 – Saint

+0

@Saintおそらくそれはスラッシュがありません。 '-classpath ./bin/:〜/ libs/rxjava-1.3.1-SNAPSHOT.jar'を試してください。 –

関連する問題