看著尚硅谷的教學,有用 druid 這個 jar,這是一個資料庫監控的 jar,翻過資料似乎挺好用,但我還沒體驗到它的方便就先遇到建置問題…
主要事故:log4j 找不到 error 要寫在哪裡
log4j 這個 jar 是用來記錄運作訊息的,可以依照需求設定要錯誤訊息出現在控制台、或是另外輸出文件紀錄,這邊就是 log4j 不知道應該寫在哪裡所引發的錯誤
1 | log4j:WARN No appenders could be found for logger (com.alibaba.druid.pool.DruidDataSource). |
解決方式
這次學到的是,無論任何解決方式,能存檔就存檔,操作完可以右鍵專案點重新整理,不然可能弄了半天其實都沒測試到變更~
方法一、 找定位~resorces 資料夾
創建一個 resorces 資料,把 log4j.properties 塞進去!
爬了很多很多文章都是這麼說把 resources 資料夾創在(或是搬到)src 下,結果沒有真的解決,而且沒有圖片或是資料夾結構可以看,resources 到底在哪?它要創在哪?好不容易找到一篇附圖的,我把它塞在跟 java 同一層的資料夾位置一樣可是它還是讀不到啊!!!!!! 終於翻到一篇文,提到要把resources資料夾加入建置路徑,那就這麼做吧!
對著專案右鍵,找到內容,找到 Java 建置路徑選項裡面的程式碼分頁
Add Folder,勾選 resources 資料夾/確定/Apply and Close
備註
如果把 properties 資料夾直接塞在 package 裡面設定成來源檔案的話,可能會造成程式碼的錯誤,因為它抓 package 的位置是以建置路徑為出發點,例如現在我假設路徑 1 是定位在src/main/java
,打開JdbcUtils.java
發現 package 的標記會是package com.atguigu.utils
,如果把 utils 改成來源的話,也就是路徑 2 定位在src/main/java/com/atguigu/utils
,則不需要 package 標記(會變成 utils 下的 utils,不存在),而我們檔案可不只有這個,如果有 100 個檔案要 import 這個 java 檔,就是 100 個檔案都要改,中間會不會又出甚麼意外就…
方法二、 檢查配置文件
有可能是 properties 文件本身內容就有問題,導致無法正常運作,我只是把第一行的 rootLogger 註解掉就重現這個錯誤了~
這邊是我的設定,詳細可以看這篇
1 | log4j.rootLogger=INFO, stdout |
方法三、清除 IDE 緩存
如果還是不行的話?可以試試看這個方法。
有時候 Eclipse 會怪怪的,可以把緩存清乾淨,然後重開就好了,這次我就是這樣做就成功讀取檔案
先找到畫面上方工具列/專案/清除
可以選擇要清除緩存的專案,也可以全部都清
其它衍生事故
解決到有點崩潰就想複製一個檔案去新的工作區試試看不一樣的操作,先讓問題卡在 log4j 這點以後再解決,結果摳過來新的檔案問題更多…先自首沒有全部解決掉,我被嚇回原本的工作區了
下面的事件是我事後回去翻 google 搜尋紀錄,有記錄到的就先記著吧
1. java.sql.SQLException: com.mysql.jdbc.Driver/test
文件配置錯誤
1 | com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error |
這個估計是最不應該的錯誤,可能已經改到眼睛花了,我的 jdbc.properties 竟然這樣寫
1 | username=XXX |
這個檔案是給 druid 讀取資料庫數據的,driver 的名稱應該是com.mysql.jdbc.Driver
,為甚麼會多一個小尾巴/test
….
還有一個可能是下載了 MySQL 8.0 以上的版本,driver 的配置應該要這樣寫才能被程式看懂
1 | driverClassName=com.mysql.cj.jdbc.Driver |
檢查 lib 中的 jar
這個錯誤也可能是 mysql 和 druid 的版本不相容引起的,我當時為了解決這個問題,下載了兩個 connector(5.1 和 8.0)嘗試連接,雖然還是失敗,但搜到有人這種狀況可以利用調整 My-SQL connector 版本解決。
但也不是完全沒有收穫,當時這兩個檔案我都放在 lib 中,而兩個 mysql-driver 也有可能會造成衝突,一樣會噴這個錯,移除了其中一個就排除這個問題了。
2. lib 之中有間諜!!
1 | archive for required library: 'XXXX' in project 'XXX' cannot be read or is not a valid zip file |
這很神奇,之前專案檔案摳過來運行沒有這個問題,後來才發現 WEB-INF 裡的 lib 資料夾裡面有 dll、propreties 還有其它奇奇怪怪的檔案,把它們從資料夾以及使用者函式庫移乾淨就可以了。
使用者函式庫在這邊:
點選對應的 lib 庫編輯/使用者程式庫/編輯,點選不要的檔案之後按移除就行了~
不過這邊我懷疑在改甚麼設定的時候,不小心選到嚴格模式之類的選項,不然照理說公司系統的資料夾應該早就掛掉了(這邊的 lib 我直接複製公司系統專案資料夾貼過來的),以後有時間研究看看。
3. exception in thread “main” java.lang.noclassdeffounderror: com/alibaba/druid/pool/druiddatasourcefactory at XXX.XXX.utils.jdbcutils.
找不到com/alibaba/druid/pool/druiddatasourcefactory
,那就是 jar 的 Class 沒有成功被引入,同時如果有開 Problems 視圖的話會發現:
1 | Classpath entry XXX will not be exported or published. Runtime ClassNotFoundExceptions may result. |
同樣情況,只要新增一個使用者程式庫就會發生這種事,沒做這個步驟的話,它就只有 jar 的殼,沒有靈魂,這可能會導致 jar 不能正常使用,會發現這個現象是因為非自動產生的專案似乎不能在建置路徑直接新增 web 應用程式程式庫,內容是空白的,我就手動把原本專案的 jar,也就是包含了 druid 在內的那個 jar 匯入使用者程式庫,結果 my-sql-connector 一直讀不到
這裡建立一個叫做「我沒有靈魂」的 lib,可以看到警告訊息
1 | Classpath entry org.eclipse.jdt.USER_LIBRARY/我沒有靈魂 will not be exported or published. Runtime ClassNotFoundExceptions may result. |
解法就是,結果只要去看 Eclipse 下方的「問題」,對著那個選項右鍵,選擇快速修正,選擇Mark the associated raw classpath entry as a publish/export dependency
IDE 去就解決了,覺得不想爬 Problems 的話,或是覺得預防勝於治療更好的夥伴也可以用手動打包:
a. 專案右鍵/內容/Deployment Assembly
b. 選擇 Java Build Path Entries 選項,就可以匯入我們剛弄好的 lib
這個功能是為了讓佈署的時候可以把需要的 jar 打包,有點類似行李箱,確定帶走的放進去執行~
4. java compiler level does not match the version of the installed java project facet.
這個問題也是發生在 Problems 裡面,似乎是個未爆彈,雖然目前不影響使用,也不知道會不會有隱患,還是處理一下。
發生原因就是我們所使用的編譯器版本與當初建置專案的版本不同,這邊就可以找到專案中的.setting
資料夾,找到org.eclipse.wst.common.project.facet.xml
用 word 或是記事本打開都可以,裡面的文件是這樣,它記錄了環境配置
1 | <?xml version="1.0" encoding="UTF-8"?> |
可以看到 java 是使用了 1.8 的版本,那我們打開 Eclipse 中的專案內容,看到 Java 編譯器標準是 1.7,跟剛才看到的 1.8 不同,把選項改成 1.8 就可以了
5. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
記得打開資料庫阿! 像我是使用 XAMPP 架設資料庫,如果沒有啟動的話就會跑出這個錯誤訊息。
參考資料
族繁不及備載,有印象的貼一下,大部分問題感謝 GPT 解答
错误:com.alibaba.druid.support.logging.JakartaCommonsLoggingImpl error 严重: {dataSource-1} init error
Eclipse : Java EE Module Dependencies is replaced by Web Deployment Assembly