2016-07-11 27 views
2

未在JDK(例如javax.websocket)包括需要的軟件包下載和爲了與-cpCLASSPATH環境變量引用到要導入(否則你得到的編譯錯誤包X不存在)。彙編後,導入的軟件包是否包含在.class文件中?

編譯,當獲得的.class文件後,是否可以將這些文件傳輸到javax.websocket包,並有該計算機上的JVM上運行它們,或者是有必要的計算機兩臺計算機上都有這個軟件包?

換句話說:當您編寫import bar.foo;時,您基本上在編寫「每當您看到foo時,請轉至此位置並查看它是什麼。」。但是,在編譯源代碼時,字節代碼是否仍然說「去這個位置並看看它是什麼」,或者它已經到達位置並「導入」了所有內容,以便位置不再需要?

+0

請注意,'import'語句僅用於編譯。他們在運行時什麼都不做。見[這個答案](http://stackoverflow.com/questions/1457863/what-c​​auses-and-what-are-the-differences-between-noclassdeffounderror-and-classn?lq=1)。是的,如果你打算使用一個類,它需要在運行時可用。 –

+0

您還需要在運行時使用外部庫 – Sanjeev

+0

@SotiriosDelimanolis您是否認爲如果Java設計人員允許您在沒有它們的情況下編譯源代碼,那麼可以省略任何導入語句,只要您確保包可用在運行時? – Gendarme

回答

1

編譯,當獲得的.class文件後,是否可以傳輸這些文件到計算機不具備javax.websocket包,並有JVM在該計算機上運行它們,或者是否有必要兩臺計算機上都有這個軟件包?

在兩臺計算機上都需要安裝該軟件包。字節碼假定在運行時將相關類提供給JVM。

此外,即使在同一臺計算機上進行編譯和運行,情況也是如此:Java編譯器從中提取程序包以進行編譯的位置可能與JVM在運行代碼時從中取出程序包的位置不同。

+0

*「Java編譯器將其包裝進行編譯的位置可能不同於JVM在運行代碼時從其中取出包的位置。」*「CLASSPATH」變量僅用於編譯而不用於運行時?在那種情況下,如何指定運行時包的提取位置? – Gendarme

+1

@Gendarme'javac'和'java'將使用相同的'CLASSPATH'環境變量。但是,您可以通過將'-classpath'選項傳遞給編譯器或JVM來覆蓋它。根據Oracle的說法,這種指定類路徑的方式優於使用'CLASSPATH'變量。 – dasblinkenlight

0

問題的一個非常詳盡的解釋可以發現,就在這裏所以,在:

要直接報價作者JB Nizet:(加着重號是我的)

編譯類路徑是用於編譯Java源文件的類路徑(使用javac -cp ...,或您的IDE)。源文件中引用的每個類必須存在於編譯類路徑中,否則編譯器會抱怨它找不到該類。

一旦編譯了類,就可以使用它們運行程序(使用java -cp ...)。顯然,源代碼直接依賴的庫應該位於運行庫類路徑中。但那不是全部。如果直接依賴CoolLibrary.jar,並且此庫在內部取決於Guava.jar,那麼Guava.jar也必須位於運行時類路徑中,儘管在編譯時不需要它。

Web應用程序有點特別。 [...原始答案繼續...]

+0

最後一點很有趣。避免不必要耦合的另一個原因。 – Gendarme

相關問題