2010-06-22 39 views
9

什麼是專業人士的使用?java中的編譯時間庫和運行時庫有什麼區別?

實際上,我在NetBeans的Project Properties> Libraries for Java Applications中看到了它。我們有兩個標籤,一個是編譯時庫和運行時庫,它看起來像我們可以添加一個圖書館要麼相互獨立的

+1

誰告訴過你在java中有這樣的選擇? – 2010-06-22 03:25:16

+0

也許你被編譯時和運行時類路徑之間的區別弄糊塗了? – akf 2010-06-22 03:33:20

+0

@ Nikita/akf我實際上在Netbeans中的Project Properties> Java庫的Java應用程序中看到了它。我們有兩個選項卡,一個用於編譯時庫和運行時庫,看起來像我們可以將庫添加到彼此獨立 – jonasespelita 2010-07-16 15:52:16

回答

7

Libraries屬性對話框的UI和術語非常混亂。

該對話框上的幫助按鈕會給你一些信息。

編譯時庫列表可能是運行時庫列表的一個子集。

考慮這種情況......

您有進口類從一個源代碼庫「widgets.jar」。 widgets.jar中的類文件引用jar文件「xml.jar」中的符號。如果您的源代碼不從xml.jar導入類,您可以將編譯時庫列表定義爲只包含widgets.jar。

當您嘗試運行你的項目,你可能需要在運行時庫列表,防止ClassNotFoundException異常的xml.jar。

+0

這就是我一直在尋找。謝謝! – jonasespelita 2011-02-03 07:03:16

+0

@Alpine:有時。在StackOverflow的註釋中嵌入一個問題確實破壞了StackOverflow的目的。使用http://stackoverflow.com/questions/ask提出問題可能會得到更多答覆者的更好迴應。 – vkraemer 2011-03-03 18:38:32

11

有沒有這樣的事編譯時庫運行庫

也許你會混合一些概念。

在Java中,要使用的庫在編譯時進行靜態驗證,並在運行時進行驗證。

例如,如果你想使用在Apache Collections庫指定IterableMap。編譯器驗證「在編譯時」您正在調用該類中存在的方法。

但是編譯器不鏈接或做多的與該庫什麼,你仍然需要在運行的時候。所以,當您的代碼執行時,Java運行時會再次搜索該類,並調用編譯器驗證的方法。

而那是什麼。

+0

感謝您的信息。但是,什麼反射?如果我們嘗試使用反射來使用類,編譯器就不會抱怨,對吧?類似[this](http://www.java-tips.org/java-se-tips/java.lang.reflect/invoke-method-using-reflection.html) – bdhar 2010-06-22 03:59:53

+3

@bdhar - 反射只是一種不同的方式做的事情使得驗證的時間比類加載晚。編譯器對以這種方式調用的方法的類型一無所知,但運行時系統(特別是反射API)確保沒有不安全的情況發生。 – 2010-06-22 04:14:46

+0

謝謝斯蒂芬.. – bdhar 2010-06-22 05:11:04

0

正如其他人所說,你是混淆概念。我認爲你真正想明白的是Maven指的是dependency scope。有時你只需要編譯時的依賴,因爲你期望它在運行時提供,有時你需要它在運行時但不編譯時。

1

也許,當你想動態加載庫,或檢查庫的存在,然後執行這段代碼進場。

在編譯過程中,編譯器需要知道什麼樣的方法的簽名,類等,以知道,如果你的代碼是正確的。因此你添加了編譯時間庫。

在運行時,JVM仍然需要庫來運行該特定代碼。但是您可以通過檢查庫是否存在來放置邏輯以避免該代碼,例如通過執行Class.for()方法。一些庫可能已經存在於系統中(例如qt.jar)或者可能不存在,並且您可以相應地檢查並執行您的代碼。

請糾正我,如果我錯了。

相關問題