擬使用BCE的SMS服務,於是下載了其SDK,加入到我的Portlet裡面。出現java.lang.NoClassDefFoundError的錯誤,費了2-3天來排查。一下為一些記錄。
增加JAR包的路徑到環境變數: 不行。
如連結所說的單獨建立一個目錄並做相關處理:不行。
解決辦法:
1.項目根目錄下建立一個libs檔案夾
2.把要加的包放到這個目錄下
3.右鍵 Build Path-> Use as source folder
4.在jar包上右鍵->add to build path
Clean: not work: 不行。
User Libraries: added to this, try: 不行。
項目下的bce_jar 目錄刪掉不行.
3rd parties' lib not included? 第三方的也都加入了項目的BCE lib裡面。: 不行。
Java Build Path: Ordre and Export : 加入了庫(自己加入的庫)bce: 不行。
文章(連結在這兒): 解決 使用了maven的項目中的 java.lang.NoClassDefFoundError: ....
加入項目目錄WEB-INF\lib ,直接從bce庫下面拖過去就可以:至少編譯成功了。而且網站可以正常啟動了。
初步看和BCE相關的錯誤沒有了。錯誤變更成如下的:
11:52:04,615 ERROR [http-bio-8080-exec-4][render_portlet_jsp:132] null
java.lang.ClassNotFoundException: com.google.common.base.Preconditions
但是,再啟動並執行對應的功能SaveValue的時候,出現的錯誤提示如下:(錯誤變了。)
11:56:11,874 ERROR [http-bio-8080-exec-10][PortletServlet:116] javax.portlet.PortletException: java.lang.NoClassDefFoundError: Could not initialize class com.baidubce.services.sms.SmsClientConfiguration
javax.portlet.PortletException: java.lang.NoClassDefFoundError: Could not initialize class com.baidubce.services.sms.SmsClientConfiguration
在產生的WAR包裡面,WEB-INF目錄下,出現了對應的JAR包(bce-java-sdk-0.10.4.jar)。至少是更正確了一步。還是從上述文章得到的啟發。
猜測出現上面的問題,可能是BCE的第三方JAR包沒有代入。於是把所有BCE第三方JAR包,都放入了WEB-INF\lib目錄下,重新編譯發布。可以運行並返回預設頁面了。不出現“停用portlet”提示了。至於手機能否收到SMS,則是另外的問題了(有大量DEBUG資訊可用)。(後記:已經正確傳送簡訊。)
初步結論:Eclipse中的項目中的WEB-INF\lib目錄下應該有第三方的JAR包作為庫,產生的WAR包將包括這些JAR,這樣才能正常運行。
(後記:在胡啟穩的教程的下一節,第19課 - “ Struts2與Liferay的整合使用” 裡面,就有將第三方的JAR包,即Struts2的JAR包放入WEB-INF\lib的示範。早看到的話,就能省一些時間了。)