解決Java ClassNotFoundException異常的實踐步驟
簡介:在Java中,當類加載器嘗試動態(tài)加載一個類卻找不到相應的.class文件時,會拋出 ClassNotFoundException 。此異常常見于類路徑錯誤、命名不規(guī)范、打包問題、手動加載類時的錯誤、依賴管理不正確、JAR包沖突以及IDE配置不當?shù)惹闆r。為避免此異常,應檢查類路徑設置、確保類名和文件名一致性、驗證依賴庫、檢查自定義ClassLoader的加載邏輯、以及解決依賴管理問題。本文將提供解決 ClassNotFoundException 的詳細步驟,并通過示例代碼和相關圖像深入解釋類加載過程。

1. ClassNotFoundException簡介
1.1 什么是ClassNotFoundException
ClassNotFoundException 是Java運行時異常的一種,它發(fā)生在嘗試加載一個不存在的類時。在Java中,當類加載器嘗試加載類文件而找不到相應的類定義時,就會拋出這個異常。
1.2 引發(fā)ClassNotFoundException的常見場景
這個異常通常在動態(tài)類加載時發(fā)生,比如在使用類名動態(tài)創(chuàng)建對象、使用JDBC連接不同類型的數(shù)據(jù)庫驅動時,或者在使用反射機制時,如果沒有正確地包含類路徑或相應的JAR文件,都可能觸發(fā)此異常。
1.3 ClassNotFoundException與NoClassDefFoundError區(qū)別
需要注意的是, ClassNotFoundException 和 NoClassDefFoundError 雖然都是類加載問題,但它們在本質上有所不同。 ClassNotFoundException 通常在編譯期就已知,是由于顯式地調(diào)用類加載器的加載類方法(如 Class.forName )且類未被找到而拋出的異常。而 NoClassDefFoundError 通常在運行時出現(xiàn),表明程序在啟動時類存在,但在運行過程中無法找到該類的定義。
public class MyMain {
public static void main(String[] args) {
try {
Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}在上面的示例代碼中,如果 com.example.MyClass 類不存在,則會拋出 ClassNotFoundException 。
2. 類路徑問題與命名規(guī)范
2.1 類路徑問題解決方法
2.1.1 類路徑的重要性
在Java程序中,類路徑(Classpath)是一個非常重要的概念,它是JVM用來查找.class文件的路徑。類路徑可以是目錄的路徑,也可以是JAR文件的路徑,甚至可以是包含多個路徑的列表。當Java虛擬機啟動時,它需要指定一個類路徑作為參數(shù),這樣它才能找到程序需要加載的類和資源。
類路徑的設置錯誤,很容易導致Java程序在運行時拋出 ClassNotFoundException 。當JVM嘗試加載一個類,但是沒有在指定的類路徑中找到該類的定義時,就會拋出這個異常。因此,對于開發(fā)人員來說,正確設置和理解類路徑是非常關鍵的。
2.1.2 解決類路徑不正確的方法
要解決類路徑不正確導致的問題,首先需要確保類路徑包含了所有需要的類和資源文件。以下是幾個解決類路徑問題的方法:
- 明確類路徑參數(shù): 在運行Java程序時,使用
-cp或-classpath參數(shù)明確指定類路徑。例如:shell java -cp .;lib/*.jar package.MainClass這里的.代表當前目錄,lib/*.jar表示lib目錄下的所有JAR文件。 - 使用環(huán)境變量: 設置
CLASSPATH環(huán)境變量,使得JVM能夠自動識別類路徑。在一些操作系統(tǒng)中,比如Unix/Linux,可以在shell的配置文件中添加,如.bashrc或.bash_profile。 - IDE設置: 如果你使用的是集成開發(fā)環(huán)境(IDE),比如Eclipse或IntelliJ IDEA,可以在項目設置中配置類路徑。這些工具通常會提供圖形界面,幫助開發(fā)者管理和配置類路徑。
- 構建工具配置: 如果項目使用構建工具,如Maven或Gradle,構建工具會自動處理類路徑。確保
pom.xml或build.gradle文件中的依賴配置正確。
2.2 命名規(guī)范和大小寫一致性
2.2.1 Java命名規(guī)范概述
Java命名規(guī)范要求開發(fā)者遵循一定的規(guī)則來命名包、類、方法和變量,以便于代碼的可讀性和維護性。以下是幾個關鍵的命名規(guī)則:
- 類名:首字母大寫,使用駝峰命名法,例如
MyClass。 - 方法和變量:首字母小寫,使用駝峰命名法,例如
myMethod。 - 常量:全部大寫,單詞間用下劃線分隔,例如
MAX_SIZE。 - 包名:全部小寫,例如
com.example.project。
遵循Java命名規(guī)范有助于統(tǒng)一團隊的代碼風格,提高代碼的可讀性,減少因命名問題引起的誤解和錯誤。
2.2.2 大小寫不一致導致的問題
Java是大小寫敏感的語言,因此在編寫代碼時,必須嚴格區(qū)分大小寫。不一致的大小寫使用可能導致編譯時無法找到類或資源,從而引發(fā) ClassNotFoundException 。以下是由于大小寫不一致導致的問題和解決方案:
- 大小寫錯誤: 類名、包名或文件名的大小寫不正確,會導致JVM無法找到相應的類或資源。例如,如果類名為
MyClass,但實際文件命名為myclass.java,則會導致編譯錯誤。 - 大小寫不敏感的文件系統(tǒng): 在某些操作系統(tǒng)中,如Windows默認對文件名大小寫不敏感,可能會隱藏這個問題。但在Linux或Mac OS等對大小寫敏感的操作系統(tǒng)上,大小寫錯誤會直接導致問題。
- 解決方案: 為了避免大小寫引起的問題,在編寫代碼時,始終使用一致的命名規(guī)則,并使用文本編輯器或IDE的自動補全功能來防止錯誤。在開發(fā)過程中,經(jīng)常檢查文件名和類名的一致性。
接下來的章節(jié)將繼續(xù)深入探討Java開發(fā)中可能遇到的 ClassNotFoundException 異常,并提供有效的解決方案和預防措施。
3. 打包錯誤與ClassLoader使用
3.1 打包錯誤的檢測與修復
打包是Java項目中將多個類文件以及資源文件整合到一個單獨的jar包中,以便于分發(fā)和部署的過程。打包錯誤往往會導致應用程序在運行時出現(xiàn)各種問題。在這一節(jié)中,我們將深入了解打包過程中常見的錯誤類型以及如何進行檢測和修復。
3.1.1 打包過程中常見的錯誤類型
打包錯誤可以分為編譯時錯誤和運行時錯誤。編譯時錯誤通常在打包階段被捕捉,例如資源文件的缺失、類文件的丟失、打包配置不當?shù)?。運行時錯誤通常在應用程序運行時暴露,比如找不到主類、加載類時無法解析依賴等。
常見的打包錯誤類型包括但不限于: - 缺失資源文件 :當資源文件未包含在最終的jar包中時,可能會導致應用程序在執(zhí)行過程中無法找到必要的配置或數(shù)據(jù)文件。 - 依賴沖突 :項目依賴多個庫時,可能會發(fā)生版本沖突,導致應用運行時出現(xiàn)類找不到或方法找不到的錯誤。 - 主類缺失 :未指定或錯誤指定應用的主類會導致無法運行打包后的應用程序。 - 簽名問題 :對于需要簽名的jar包,如果打包過程中簽名信息有誤或缺失,應用在安全性檢查時會失敗。 - 錯誤的清單文件(MANIFEST.MF) :清單文件配置錯誤會導致應用程序啟動失敗,如類路徑指定錯誤。
3.1.2 錯誤的檢測和修復方法
為了有效地檢測和修復打包錯誤,可以采取以下方法:
- 使用打包工具的檢查功能 :例如,Maven的
mvn package命令可以進行項目的構建和打包,如果過程中出現(xiàn)錯誤,工具會提供錯誤信息。同樣,Gradle也提供了類似的檢查機制。 - 運行單元測試 :在打包前運行單元測試可以提前發(fā)現(xiàn)代碼中潛在的問題。通常打包工具支持在打包前運行測試用例。
- 使用IDE內(nèi)置的打包功能 :許多集成開發(fā)環(huán)境(IDE)提供了可視化的打包操作,可以即時發(fā)現(xiàn)配置錯誤。
- 驗證清單文件 :檢查
MANIFEST.MF文件是否包含了正確的主類名稱,并且所有的類路徑和依賴項都已正確聲明。 - 手動檢查jar文件內(nèi)容 :在沒有打包工具輔助的情況下,可以解壓jar文件,手動檢查其中的文件是否完整,資源文件是否包含。
代碼示例:
// 一個簡單的清單文件示例
Manifest manifest = new Manifest();
Attributes mainAttributes = manifest.getMainAttributes();
mainAttributes.put(Attributes.Name.MANIFEST_VERSION, "1.0");
mainAttributes.put(new Attributes.Name("Main-Class"), "com.example.MainApplication");
// ...其它必要設置在上述代碼中,我們創(chuàng)建了一個清單文件,并手動指定了主類名稱。在打包過程中,這個清單文件會被包含在最終的jar包中,以確保Java虛擬機能夠正確地找到并執(zhí)行主類。
3.2 ClassLoader使用注意事項
ClassLoader是Java虛擬機中負責加載類的機制。在Java中,類加載器不僅僅是技術細節(jié),它還是實現(xiàn)框架解耦、動態(tài)擴展和熱部署等高級功能的關鍵。使用ClassLoader時,開發(fā)者需要注意以下幾個重要方面。
3.2.1 ClassLoader的作用與原理
ClassLoader的核心作用是將類文件( .class 文件)加載到Java虛擬機中,并負責類的解析、鏈接和初始化過程。在JVM中,類加載器按照層級結構組織,包括根加載器、擴展加載器和應用加載器等。
ClassLoader的工作原理是: - 加載 :查找并讀取類文件,根據(jù)需要將二進制數(shù)據(jù)轉換成方法區(qū)的內(nèi)部數(shù)據(jù)結構。 - 鏈接 :將類文件轉換成的內(nèi)部表示與JVM運行時數(shù)據(jù)結構相融合。鏈接分為驗證、準備和解析三個步驟。 - 初始化 :對類中的靜態(tài)變量進行初始化,執(zhí)行靜態(tài)代碼塊。
3.2.2 使用ClassLoader時應注意的問題
ClassLoader的使用需要注意以下幾點:
- 避免類路徑問題 :在開發(fā)插件化或框架應用時,需要注意各個ClassLoader之間的類路徑隔離,避免產(chǎn)生不期望的類加載沖突。
- 了解雙親委派模型 :ClassLoader使用雙親委派模型確保Java平臺的安全性。了解這一模型,以及如何自定義ClassLoader來打破或擴展這種模型。
- 明確類的加載時機 :類的加載時機會影響到應用程序的性能和行為。了解JVM的類加載策略,合理設計類的加載時機。
- 使用合適的類加載器 :對于Web應用和企業(yè)應用,通常需要自定義ClassLoader來按需加載不同的應用模塊。
代碼示例:
public class CustomClassLoader extends ClassLoader {
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
// 自定義類加載邏輯,例如從網(wǎng)絡加載類數(shù)據(jù)
byte[] classData = loadClassData(name);
if (classData == null) {
throw new ClassNotFoundException();
} else {
return defineClass(name, classData, 0, classData.length);
}
}
private byte[] loadClassData(String className) {
// 實現(xiàn)加載類數(shù)據(jù)的邏輯,返回類的字節(jié)碼數(shù)組
}
}在上述自定義ClassLoader的實現(xiàn)中, loadClassData 方法需要開發(fā)者根據(jù)實際情況來實現(xiàn)類數(shù)據(jù)的加載。注意, defineClass 方法需要的參數(shù)是類的名稱和字節(jié)碼數(shù)組,它的作用是將字節(jié)碼轉換成JVM內(nèi)部的類表示形式。
在理解ClassLoader的工作原理和注意事項后,開發(fā)者可以更加自如地控制類的加載過程,從而更好地實現(xiàn)Java應用的高級特性,如熱部署和模塊化開發(fā)。
4. 依賴管理和沖突解決
隨著項目規(guī)模的增長,依賴管理和沖突解決成為了開發(fā)過程中的一大挑戰(zhàn)。依賴管理工具如Maven和Gradle,能夠有效地管理項目依賴,但在復雜的依賴樹中,沖突仍然不可避免。接下來,我們將深入探討如何排查依賴問題,并提供解決方案。
4.1 Maven或Gradle依賴問題排查
依賴問題排查是確保構建順利進行的關鍵步驟。Maven和Gradle通過定義清晰的依賴結構和版本控制機制,幫助項目維護依賴的一致性和清晰度。然而,當問題出現(xiàn)時,開發(fā)者需要快速準確地定位并解決。
4.1.1 Maven依賴問題的常見表現(xiàn)
Maven依賴問題通常表現(xiàn)為:
- "NoClassDefFoundError"或"ClassNotFoundException"等類找不到的錯誤。
- 不同版本的同一個庫或其依賴沖突。
- 依賴沒有被正確下載或更新,導致類或資源文件缺失。
4.1.2 Gradle依賴問題的常見表現(xiàn)
Gradle作為現(xiàn)代構建工具,雖然提供了更靈活的構建能力,但也可能會遇到以下問題:
- 類路徑解析問題,導致運行時找不到類。
- 依賴聲明不一致,引發(fā)版本沖突。
- Gradle緩存問題,導致依賴更新不及時或錯誤。
4.2 JAR文件沖突解決方案
JAR文件沖突是依賴管理中經(jīng)常遇到的問題,不僅限于Maven或Gradle,任何使用JAR文件的Java項目都有可能遭遇此問題。
4.2.1 JAR文件沖突的原因
產(chǎn)生JAR文件沖突的原因很多,常見的有:
- 同一個庫的不同版本被不同依賴引入。
- 不同庫間存在依賴共享,但在不同版本下存在差異。
- 開發(fā)者或工具的錯誤配置,導致依賴解析錯誤。
4.2.2 解決JAR文件沖突的方法
解決JAR文件沖突的方法包括:
- 仔細檢查項目的依賴樹,使用工具如
mvn dependency:tree或gradle dependencies。 - 使用依賴管理工具的排除機制,例如Maven的
<exclusions>標簽。 - 采用依賴升級或降級的策略,解決版本沖突。
- 對于多模塊項目,合理使用模塊化來隔離依賴,減少全局沖突。
- 使用依賴沖突解決工具,比如
versions-maven-plugin或Gradle的依賴管理插件。
代碼塊案例
假設我們遇到了一個典型的Maven依賴沖突問題,我們可以使用以下命令檢查依賴樹:
mvn dependency:tree -Dverbose -Dincludes=commons-logging
該命令將會輸出包含commons-logging庫的依賴樹,幫助我們發(fā)現(xiàn)是哪個依賴引入了不同版本的commons-logging。
代碼邏輯解讀
mvn dependency:tree 是Maven提供的一個功能強大的命令,它可以展示項目的依賴關系樹。我們使用了 -Dverbose 參數(shù)來增加輸出的詳細程度,同時 -Dincludes 參數(shù)用于指定我們感興趣的特定依賴(例如commons-logging)。執(zhí)行這個命令后,我們可以查看輸出中是否存在版本沖突,或者某個依賴是否被不期望的模塊引入。
通過這種分析,我們可以確定問題的根源,并采取相應的解決措施。如若發(fā)現(xiàn)沖突的依賴,我們可以考慮使用Maven的 <exclusions> 標簽來明確排除不需要的版本,或者調(diào)整依賴配置,確保項目中只使用一致的版本。
Mermaid 流程圖
為了說明依賴沖突的排查和解決流程,我們可以使用Mermaid語法編寫一個流程圖:
graph TD;
A[開始排查依賴問題] --> B[檢查依賴樹];
B --> C{是否發(fā)現(xiàn)沖突?};
C -->|是| D[確定沖突依賴];
C -->|否| E[依賴樹無沖突];
D --> F[確定解決策略];
F --> G[修改pom.xml配置];
G --> H[重新構建項目];
E --> H;
H --> I[結束并驗證結果];通過上述流程圖,我們可以清晰地了解排查和解決依賴沖突的步驟。這個流程從開始檢查依賴樹到最終解決問題并驗證結果,為處理依賴問題提供了一個結構化的路徑。
表格展示
為了進一步解釋依賴沖突的類型和解決方法,我們可以使用表格來展示信息:
| 沖突類型 | 描述 | 解決方法 | |--------|------|--------| | 版本沖突 | 項目中引入了同一個庫的不同版本 | 使用Maven的 <exclusions> 標簽或者升級/降級庫版本 | | 依賴共享沖突 | 不同的庫引入了相同依賴的不同版本 | 使用依賴管理工具的排除機制,或重構項目依賴結構 | | 依賴缺失 | 依賴未能被正確下載或解析 | 檢查網(wǎng)絡連接,確認倉庫配置,清理并重新構建項目 |
通過表格,我們可以直觀地比較不同類型的沖突,并快速找到對應的解決方法。這種方式對于經(jīng)驗豐富的開發(fā)者來說是直觀且高效的。
總結而言,依賴管理與沖突解決是構建健康項目的基石。通過正確使用Maven和Gradle等工具,結合手動檢查與問題解決技巧,可以有效避免和解決大多數(shù)依賴相關的問題,從而確保項目的順利開發(fā)與維護。
5. 開發(fā)環(huán)境與異常處理
5.1 IDE配置檢查
5.1.1 IDE配置不當?shù)挠绊?/h4>
IDE(集成開發(fā)環(huán)境)配置錯誤可能導致各種問題,例如編譯錯誤、運行時異常,以及項目構建失敗等。不當?shù)呐渲每赡馨ǖ幌抻谌鄙俦匾牟寮?、不正確的JDK版本選擇、路徑指向錯誤,以及類路徑(Classpath)設置不當?shù)?。這些問題可能會在開發(fā)過程中造成重復的調(diào)試和修復工作,影響開發(fā)效率和產(chǎn)品質量。
5.1.2 如何檢查和配置IDE環(huán)境
為了確保開發(fā)環(huán)境穩(wěn)定可靠,開發(fā)者需要對IDE進行定期的檢查和配置。以下是一些檢查和配置IDE環(huán)境的基本步驟:
- 確認JDK版本和路徑設置:
- 確保IDE使用的JDK版本與項目所需版本一致。
- 檢查JDK安裝路徑是否已正確配置在IDE中。
- 檢查插件與擴展:
- 安裝必要的開發(fā)工具插件,如代碼格式化、版本控制、數(shù)據(jù)庫管理工具等。
- 定期更新IDE及其插件,以保證兼容性和安全性。
- 配置項目構建路徑:
- 檢查并更新項目的源代碼目錄(src目錄)、資源目錄(resources目錄)以及輸出目錄(如bin目錄)的設置。
- 確保依賴庫已正確配置在類路徑中,例如通過Maven或Gradle管理的項目,IDE應能識別和使用這些依賴庫。
- 調(diào)整編譯和運行時設置:
- 根據(jù)項目需求調(diào)整編譯器設置,如編譯級別的Java版本。
- 設置正確的運行時參數(shù),比如JVM內(nèi)存大小、系統(tǒng)屬性等。
5.2 ClassNotFoundException處理步驟
5.2.1 異常處理的基本步驟
處理 ClassNotFoundException 這一運行時異常時,可以遵循以下基本步驟:
- 檢查類名稱:
- 確保引用的類名稱與實際的類名完全一致,包括大小寫。
- 檢查類路徑:
- 查看并確保引發(fā)異常的類存在于類路徑中。
- 如果使用了IDE,通過其項目視圖檢查該類是否在正確的源代碼目錄下。
- 檢查依賴管理:
- 對于依賴庫,確認所需的類是否在項目所使用的庫中,并且版本兼容。
- 重啟IDE或構建工具:
- 有時候IDE或構建工具可能沒有及時更新類路徑,重啟它們可能會解決問題。
5.2.2 遇到ClassNotFoundException的應對策略
當遇到 ClassNotFoundException 時,以下策略可能有助于快速定位和解決問題:
- 驗證類加載器:
- 分析堆棧跟蹤信息,了解是哪個類加載器未能找到類。
- 檢查自定義類加載器的實現(xiàn),確保它們正確地加載了類。
- 檢查動態(tài)加載:
- 如果使用了動態(tài)類加載技術(如Java的
Class.forName),確認提供的類名是正確的,并且類是在運行時被正確加載的。
- 如果使用了動態(tài)類加載技術(如Java的
- 檢查第三方框架:
- 如果項目使用了如Spring或Hibernate等第三方框架,確保所有配置正確,框架能加載所需的類。
- 查看文檔和日志:
- 查看任何相關文檔或日志,可能有其他開發(fā)者已經(jīng)遇到并解決了類似的問題。
5.3 示例代碼分析
5.3.1 代碼示例展示
public class Main {
public static void main(String[] args) {
try {
Class.forName("com.example.NonExistentClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}在上述代碼中, Class.forName 嘗試加載一個名為 com.example.NonExistentClass 的類。如果該類不存在于項目類路徑中,將拋出 ClassNotFoundException 。
5.3.2 代碼中引發(fā)ClassNotFoundException的原因分析
在分析中,我們發(fā)現(xiàn) com.example.NonExistentClass 這個類可能尚未定義,或者項目中并沒有包含這個類的源代碼或依賴庫。此外,如果類路徑配置錯誤,即使類實際存在,JVM也可能無法定位該類而導致異常。
5.4 類加載過程可視化
5.4.1 類加載機制概述
類加載機制是Java運行時的一個核心功能。當Java程序首次運行時,它通過類加載器按照以下順序查找和加載類:
- Bootstrap ClassLoader(啟動類加載器):
- 加載JRE的核心類庫,如
java.lang.*等。 - Extension ClassLoader(擴展類加載器):
- 加載JRE擴展目錄下的類庫,如
javax.*等。 - System ClassLoader(系統(tǒng)類加載器):
- 加載類路徑(Classpath)上的類庫。
- 自定義類加載器:
- 開發(fā)者可以創(chuàng)建自定義類加載器來加載特定的類。
5.4.2 可視化工具使用方法及作用
為了更直觀地理解類加載過程,開發(fā)者可以使用一些類加載可視化工具。例如, jclasslib 是一個常用的可視化工具,它能展示類文件的結構,包括常量池、字段、方法等信息。通過使用這些工具,開發(fā)者可以:
- 查看類文件的詳細結構。
- 分析類加載器是如何加載類文件的。
- 調(diào)試自定義類加載器的問題。
使用可視化工具,開發(fā)者可以更有效地分析和解決類加載相關的異常,確保應用穩(wěn)定運行。
到此這篇關于解決Java ClassNotFoundException異常的實踐指南的文章就介紹到這了,更多相關Java ClassNotFoundException異常內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- 解決IDEA啟動springboot項目報錯java.lang.ClassNotFoundException:?javax.servlet.ServletContext
- 如何解決java.lang.ClassNotFoundException: com.mysql.jdbc.Driver問題
- Java類加載異常:java.lang.ClassNotFoundException解決方法
- 解決執(zhí)行Junit單元測試報錯java.lang.ClassNotFoundException問題
- 解決Tomcat?Caused?by:?java.lang.ClassNotFoundException:?java.util.logging.Logger的問題
- 一文深入分析java.lang.ClassNotFoundException異常
- 解決Tomcat啟動報異常java.lang.ClassNotFoundException問題
- Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type異常
- Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.Transformer異常
- Android Caused by: java.lang.ClassNotFoundException解決辦法
相關文章
JAVA編程實現(xiàn)隨機生成指定長度的密碼功能【大小寫和數(shù)字組合】
這篇文章主要介紹了JAVA編程實現(xiàn)隨機生成指定長度的密碼功能,可生成帶有大小寫和數(shù)字組合的隨機字符串,需要的朋友可以參考下2017-07-07
詳解IDEA2020新建spring項目和c3p0連接池的創(chuàng)建和使用
C3P0是一個開源的JDBC連接池,它實現(xiàn)了數(shù)據(jù)源和JNDI綁定,本文就使用Spring實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
關于spring項目中無法加載resources下文件問題及解決方法
在學習Spring過程中,TestContext框架試圖檢測一個默認的XML資源位置,再resources下創(chuàng)建了一個com.example的文件夾,執(zhí)行時,報錯,本文給大家介紹spring項目中無法加載resources下文件,感興趣的朋友跟隨小編一起看看吧2023-10-10

