右鍵 This PC(此電腦) -> Properties(屬性) -> Advanced system settings(高級系統(tǒng)設(shè)置) -> Environment Variables(環(huán)境變量)...
輸入:
變量名:JAVA_HOME 變量值:電腦上JDK安裝的絕對路徑
輸入完畢后點(diǎn)擊 OK。
JDK 路徑下必須能夠看到如下的文件。
如果存在 CLASSPATH 變量,選中點(diǎn)擊 Edit(編輯)。
如果沒有,點(diǎn)擊 New(新建)... 新建。
輸入/在已有的變量值后面添加:
變量名:CLASSPATH 變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
點(diǎn)擊 OK 保存。
由于 win10 的不同,當(dāng)選中 Path 變量的時候,系統(tǒng)會很方便的把所有不同路徑都分開了,不會像 win7 或者 win8 那樣連在一起。
新建兩條路徑:
%JAVA_HOME%\bin %JAVA_HOME%\jre\bin
項目地址
https://github.com/yinjihuan/kitty-cloud[1]
今天遇到了一個錯誤,一般的錯誤提示會很明顯,一看就知道是什么問題。今天遇到的這個說實話真的不好找原因,一般在這種情況下該怎么解決呢?
分享下我的思路吧,不一定是最好的,至少有用。
直接上圖吧,下面是報錯信息:
為了方便查看,我把最重要的信息提取出來,如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [com/cxytiandi/kitty/web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
java.lang.ArrayStoreException 這個確實平時很少遇到,看了下源碼,這個是數(shù)組存儲異常。比如下圖中我框起來的部分就清楚的表示了在什么場景下會出現(xiàn)這個異常。
也就是在存儲的時候類型不一致,然后就報錯了唄!
第二個需要關(guān)注的錯誤信息是 WebAppConfigurer.class,這個還算挺明確的,告訴我哪個類有問題,然后我看了下對應(yīng)的代碼,也就手動的映射了資源路徑而已。
于是我就想,是不是這里面哪個類加載的時候出問題了,我把 WebAppConfigurer 直接去掉了,但是并沒什么用,后面還是報的相同的錯誤,只不過是提示另一個類了,就是 WebMvcAutoConfiguration。
[org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
所以說這些錯誤信息沒能直接定位問題就是這個原因,我們要關(guān)注的還是 java.lang.ArrayStoreException 這個異常,只要找到這個異常發(fā)生的地方就能解決了。
下面只能借助于 IDEA 強(qiáng)大的調(diào)試功能了,增加一個 Java Exception Breakpoints 了。
然后 debug 模式重啟,果不其然就報錯的時候就進(jìn)斷點(diǎn)了。
這下終于找到原因了,parseClassValue 的時候出問題了,Class 就是 org.springframework.cloud.sleuth.instrument.web.client.feign.TraceFeignClientAutoConfiguration。
這個類是我當(dāng)時在 Sleuth 中擴(kuò)展 Sentinel 對 Feign 支持的時候做了一些修改,沒想到居然出了 Bug。
擴(kuò)展原文鏈接:當(dāng)Spring Cloud Alibaba Sentinel碰上Spring Cloud Sleuth會擦出怎樣的火花
下面給大家說明下真正的原因吧,在這個擴(kuò)展模塊中 sentinel 的依賴是可選的,如下:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel</artifactId>
<optional>true</optional>
</dependency>
剛好報錯的項目中不需要用到 Sentinel,但是用到了 Sleuth 和 Feign,所以 TraceFeignClientAutoConfiguration 生效了。主要還是 Conditional 都滿足條件了。
項目中又沒顯示指定依賴 Sentinel,這個類自然加載失敗。
所以解決辦法就是要么加 Sentinel 依賴,要么就是在@ConditionalOnClass 中加上 Sentinel 的類,這樣只有當(dāng)在 Sentinel 的類在 classpath 中存在的時候才會加載,如果項目沒依賴 Sentinel 那么就不加載,這樣就沒問題了。
最后總結(jié)下吧,主要還是要找到真正問題發(fā)生在什么地方,有的時候異常信息給出的并不一定是真正的地方,只是有關(guān)聯(lián)而已。
當(dāng)你封裝的模塊設(shè)置了 optional=true 的時候,在對應(yīng)的配置類加載生效也需要用@ConditionalOnClass 來進(jìn)行判斷啟用,否則就會出現(xiàn)上面的問題。