2017-05-29 40 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."); 
       } 
      }); 
    } 
} 

然後我編譯

[email protected]:~/test/RxJava$ javac -d ./bin -classpath ~/libs/rxjava-1.3.1-SNAPSHOT.jar src/com/limx/reactive/CreateDemo.java 

有在bin目錄下生成編譯成功後,一些coressponding類文件。

但是,當我執行與

[email protected]:~/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 

似乎不能找到內部類「OnSubscribe」類「可觀察的」,對不對?但爲什麼以及如何解決它?

/**********************添加更多問題****************/

[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. 

上述工作命令成功,但現在我有進一步quesitions。

  1. 異常說,它無法找到可觀察$ OnSubscribe而不是可觀察的定義,這意味着可觀察類是解決了,那麼爲什麼rxjava-1.3.1-SNAPSHOT.jar需要的?

  2. 如果classpath的順序與進口環鏈是否一致?否則,如何解釋它在更改訂單時不起作用。

這裏是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斌/ *' –

+0

我都試過了,但它不會仍然工作。 limxtop @ IdeaPad:〜/ test/RxJava $ java -classpath ./bin/* com.limx.reactive.CreateDemo 錯誤:無法找到或加載主類com.limx.reactive.CreateDemo – Saint

+0

其實-classpath bin/*是錯的。有關說明和更多詳細信息,請參閱http://docs.oracle上的瞭解類路徑通配符一節。com/javase/7/docs/technotes/tools/windows/classpath.html – Saint

回答

1

您需要的rxjava-1.3.1-SNAPSHOT.jar添加到類路徑也因爲它包含RxJava(Observable等)類:

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。 limx.reactive.CreateDemo 線程「main」中的異常java.lang.NoClassDefFoundError:rx/Observable $ OnSubscribe – Saint

+0

但是當我改變classpath的值的順序時,它正常工作,這讓我感到困惑。 limxtop @的IdeaPad:〜/測試/ RxJava $ java的-classpath〜/庫/ rxjava-1.3.1-SNAPSHOT.jar:./倉/ com.limx.reactive.CreateDemo 下一步:1 下一頁:2 下一頁:3 下一個:4 序列完整。 – Saint

+0

@Saint可能是缺少的斜線。你可以試試'-classpath ./bin/:〜/ libs/rxjava-1.3.1-SNAPSHOT.jar' –

相關問題