運行時vs編譯時類路徑

這確實應該是一個簡單的區別,但是我一直在回答有關Stackoverflow的許多類似問題,并且經常有人誤解此事。

那么,什么是類路徑? 應用程序所需的一組所有類(以及帶有類的jar)的集合。 但是有兩個或實際上三個不同的類路徑:

  • 編譯時的類路徑。 包含您在IDE中添加的類(假設您使用IDE)以編譯代碼。 換句話說,這是傳遞給“ javac”的類路徑(盡管您可能正在使用其他編譯器)。
  • 運行時類路徑。 包含運行應用程序時使用的類。 那就是傳遞給“ java”可執行文件的類路徑。 對于Web應用程序,這是您的/ lib文件夾,以及應用程序服務器/ Servlet容器提供的任何其他jar
  • 測試類路徑–這也是一種運行時類路徑,但是在運行測試時使用。 測試不在您的應用程序服務器/ servlet容器中運行,因此它們的類路徑有些不同

Maven定義了依賴范圍,這對于解釋不同類型的類路徑之間的區別非常有用。 閱讀每個范圍的簡短說明 。

許多人認為,如果他們在存在給定的jar文件的情況下成功編譯了該應用程序,則意味著該應用程序將正常運行。 但這并不需要-您需要與用于編譯應用程序的jar相同的jar才能出現在運行時類路徑中。 好吧,不一定所有的人,也不一定只有他們。 一些例子:

  • 您可以使用編譯時類路徑上的給定庫來編譯代碼,但是忘記將其添加到運行時類路徑中。 JVM拋出NoClasDefFoundError,這意味著缺少一個類,該類在編譯代碼時存在。 此錯誤是一個清楚的信號,表明您在運行時類路徑上缺少編譯時類路徑上的jar文件。 反過來,您依賴的jar也有可能取決于您在任何地方都沒有的jar。 這就是為什么(必須)聲明庫的依賴關系的原因,以便您知道要在運行時類路徑上放置哪些jar
  • 容器(Servlet容器,應用程序服務器)具有一些內置庫。 通常,您不能覆蓋內置的依賴項,即使可以,它也需要其他配置。 因此,例如,您使用提供了servlet-api.jar的Tomcat。 您可以使用編譯時類路徑上的servlet-api.jar來編譯應用程序,以便可以在類中使用HttpServletRequest,但不要將其包含在WEB-INF / lib文件夾中,因為tomcat會將其自己的jar放入運行時類路徑。 如果您重復依賴項,則可能會得到奇怪的結果,因為類加載器會感到困惑。
  • 您正在使用的框架(例如spring-mvc)依賴于另一個庫進行JSON序列化(通常是Jackson)。 實際上,您在編譯時的類路徑上不需要Jackson,因為您沒有引用它的任何類,甚至沒有引用它們的spring類。 但是spring內部需要Jackson,因此jackson jar必須位于WEB-INF / lib(運行時類路徑)中,才能進行JSON序列化。

當您考慮編譯時常量和版本不匹配時,情況可能會更加復雜,但是一般的要點是:您用于編譯和運行應用程序的類路徑是不同的,您應該意識到這一點。

參考: Bozho的技術博客博客中的JCG合作伙伴 Bozhidar Bozhanov的 運行時類路徑與編譯時類路徑 。


翻譯自: https://www.javacodegeeks.com/2012/04/runtime-vs-compile-time-classpath.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373202.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Unity3d 實現頂點動畫

在今年GDC上發現一個非常有趣的演講,叫做Animating With Math,遂實現之,是講述頂點shader動畫的,舉了幾個經典的例子,但是講者并沒有給代碼,而是像虛幻引擎那樣的節點,這樣更加清楚明了之前博主…

php codeigniter ext,php – 私有服務器上CodeIgniter不正確的系統路徑

上傳到服務器的codeigniter項目給我以下錯誤.Your system folder path does not appear to be set correctly. Pleaseopen the following file and correct this: index.php它在當地運作良好在000webhost.com托管.When uploaded to private server of parallels it gives the a…

對于表單的一些想法

表單 <form id"" name"" method"get/post" action""> 其中get提交長度有限制&#xff0c;并且編碼后內容在地址欄可見&#xff0c;post與其相反。 </form> 文本輸入 文本框<input type"text" id""…

REST端點,可使用Apache Camel進行集成

REST是一種用于組織資源的體系結構樣式&#xff0c;當應用于基于HTTP的服務時&#xff0c;REST可以構建無狀態的&#xff0c;解耦的&#xff0c;可伸縮的服務。 HTTP方法&#xff0c;HTTP標頭和mime類型都允許開發人員實現REST樣式。 諸如Jersey和Fuse Services Framework&…

Appium+Python API相關知識了解

首先&#xff0c;要先了解&#xff0c;官方Appium API // https://testerhome.com/topics/3144 剛開始的時候&#xff0c;沒有看官方API&#xff0c;然后在網上瞎找學習資料&#xff0c;發現python相關的很少&#xff0c;看了API才知道&#xff0c;就是selenium webdriver的定位…

JSON用于多態Java對象序列化

長期以來&#xff0c;JSON已成為客戶端和服務器之間各種數據序列化的事實上的標準。 除其他外&#xff0c;它的優勢是簡單和易于閱讀。 但是&#xff0c;簡單起了一些限制&#xff0c;我今天要談的其中一個限制是&#xff1a;存儲和檢索多態Java對象。 讓我們從一個簡單的問題開…

linux 命令分類,常用linux 命令分類整理(篇一)

工作中接觸linux時間也不算短了&#xff0c;不同于Windows的圖形化操作&#xff0c;使用linux幾乎百分之九十五的情況是在命令行下過日子&#xff0c;過去的兩年里&#xff0c;零零碎碎整理過一版自己工作中涉及到和學習過的命令(不過常用的只有三十個左右)&#xff0c;思前想后…

考研復習策略

考研復習是一個不容易的過程&#xff0c;有好的策略事半功倍&#xff0c;以我曾經失敗的教訓和成功的實踐給出了我認為不錯的策略&#xff0c;只要能做到&#xff0c;我相信一定能考研成功。 院校選擇&#xff1a;985院校在選擇考研院校是有優勢的&#xff0c;院校考慮的因素有…

js中的this指針(二)

在 js 中聲明并定義一個函數后&#xff0c;除了定義時傳入的形式參數&#xff0c;函數還會接收到 2 個附加的參數&#xff1a;this 和 arguments。 this 指針的值取決于調用時的模式。 當這個函數被保存為對象的一個屬性時&#xff0c;它被稱為“方法”。當一個方法被調用時&am…

使用AspectJ和Spring簡化了AOP

我最近開始研究面向方面的編程&#xff08;AOP&#xff09;&#xff0c;至少可以說使我興奮。 當然我很熟悉它&#xff0c;因為我看到它在Spring中用于事務管理&#xff0c;但是我從未深入研究它。 在本文中&#xff0c;我想展示通過AspectJ可以快速掌握AOP和Spring。 本文中的…

第一沖刺階段 工作總結 04

1、昨天我繼續我的任務&#xff0c;連接數據庫。 2、今天打算繼續做數據庫的連接。 3、遇到的問題&#xff1a;昨天在數據庫連接時&#xff0c;老是連接不上&#xff0c;顯示錯誤&#xff0c;所以今天打算接著弄。轉載于:https://www.cnblogs.com/zz0906/p/5422510.html

windows2012同步linux時間,Windows server2012時間同步NTP配置

遇到經常服務器時間無法同步&#xff0c;可以自己建立一臺時間同步服務器&#xff0c;NTP配置如下&#xff1a;一、服務端配置 (Ntp服務器&#xff0c;客戶端將根據這臺服務器的時間進行同步)1、微軟鍵R鍵&#xff0c;進入“運行”&#xff0c;輸入“regedit”,進入注冊表2、 H…

反差萌

反差萌 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 0 Accepted Submission(s): 0 Problem Description有2N個人&#xff0c;每人有個萌值Mi(1<i<2N)。 要求將他們分為N對&#xff0c;使得反差值之和…

Java EE 6示例– Galleria第2部分

您可能在最后一篇Java EE 6 Galleria示例帖子中關注了我。 第一個是基本介紹。 第二個是關于在最新的GlassFish上運行它。 有人提到RedHat&#xff0c;我們應該研究將這個示例從GlassFish中移除。 很好;&#xff09;感謝您的好主意。 這正是我們今天要做的。 我將把Galleria示例…

suggest

http://lovebeyond.iteye.com/blog/941633轉載于:https://www.cnblogs.com/sunxun/p/5421251.html

linux的tar命令壓縮26g文件,linux如何使用tar命令大包壓縮進文件

linux如何使用tar命令大包壓縮進文件發布時間&#xff1a;2020-05-29 12:30:14來源&#xff1a;億速云閱讀&#xff1a;206作者&#xff1a;Leah本篇文章主要介紹linux中使用tar命令大包壓縮進文件的方法。內容比較詳細&#xff0c;文章包含了命令的使用示例&#xff0c;希望大…

與reCAPTCHA的Spring集成

有時我們只需要CAPTCHA &#xff0c;這是一個可悲的事實。 今天&#xff0c;我們將學習如何與reCAPTCHA集成。 因為主題本身并不是特別有趣和高級&#xff0c;所以我們將通過使用Spring Integration處理低級細節來過度設計&#xff08;&#xff1f;&#xff09;。 Google決定使…

《機器學習基石》---感知機算法

1 推導感知機模型 基本思想是&#xff0c;把特征的線性加權值作為一個分數&#xff0c;根據這個分數與一個門限值的關系來進行分類&#xff1a; 我們加一個特征x0等于1&#xff0c;門限值就可以放到w里面去&#xff0c;得到更簡單的形式&#xff1a; 這就是感知機模型&#xff…

未知錯誤:1000正在終止線程

若在try{} catch{}的catch 塊中加入 catch (Exception ex) { Response.Write(ex.Message); Response.End(); } 則捕獲異常后&#xff0c;提示未知錯誤&#xff1a;1000正在終止線程 轉載于:https://www.cnblogs.com/dennysong/p/5422567.…

分叉并加入Java 7 – JSR 166并發實用程序

Java 7最有趣的改進之一是對并發的更好支持。 使用JSR 166并發實用程序&#xff0c;我們可以對并發進行一些非常有用的改進。 在我看來&#xff0c;fork-join庫在軟件工程中具有很高的實際應用潛力。 Fork and join為算法提供了非常簡單的編程模型&#xff0c;可以將其實現為遞…