簡體   English   中英

Java庫運行時與編譯時

[英]Java Libraries Runtime vs Compile Time

當使用Tomcat作為應用程序服務器來設置Java Web應用程序時,我常常對何時可用庫感到困惑。 通過有關堆棧溢出的討論,我了解到一些庫(.jar)文件在運行時可用,而另一些在編譯時可用。 通常,我會得到錯誤,並會通過反復試驗來解決它們,將jar文件放在不同的目錄中,直到應用程序運行或編譯為止。 最近向我指出,您可以在運行時通過WEB-INF / lib文件夾使.jar庫可用。 我開始考慮這個問題,並提出了一些問題。 過去,我已經閱讀了有關該主題的信息,但是沒有找到將信息置於易於理解和保留的上下文中的資源。

  1. 您可以為項目設置編譯時類路徑和運行時類路徑嗎?

    一種。 類路徑甚至是討論庫的適用術語嗎?

  2. WEB-INF / lib是使庫在運行時可用的唯一方法嗎? 在運行時可以使用Tomcat中的lib文件夾嗎?

  3. 這與類加載器有何關系? 我知道創建了一個類加載器的層次結構。 這些嚴格用於運行時操作嗎?

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

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

Webapp有點特別。 Servlet規范指定,用於執行webapp的類路徑由部署的webapp的WEB-INF / classes目錄以及WEB-INF / lib中包含的所有jar組成。 所有的Web應用程序都可以訪問由Tomcat直接提供的本地servlet和JSP jar。 實際上,Tomcat的內部類(例如servlet-api接口的實現類)也可用於webapp,但是依靠這些類不是一個好主意,因為它將把您的webapp綁定到tomcat。

對於Webapp,談論運行時類路徑有點簡化。 實際上,每個Webapp的類都是由tomcat的特定類加載器動態加載的。 這個webapp類加載器是tomcat類加載器的子類。 因此,從理論上講,您可以將Web應用程序jar直接放置在Tomcat的類路徑中,但這將意味着所有Web應用程序都將共享這些庫,並且在取消部署和重新部署Web應用程序時會遇到問題。 例如,每個Web應用程序都有一個特定的類加載器,其目的是能夠在同一個JVM中擁有一個依賴於Guava 11.0的應用程序,以及另一個依賴於Guava 12.0的應用程序。

有關tomcat類加載器的更多信息,請閱讀文檔

  1. 在eclipse中,您具有在編譯時包括庫的java build path ,並且具有用於運行時的order and export

  2. 默認情況下僅tomcat庫可用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM