記一次Weblogic發布Springboot遇到的坑


項目使用的是Springboot,之前直接使用JAR包的方式發布,但在客戶這邊實施發布的時候,客戶使用的容器是weblogic,版本為 10.3.6。  痛苦就此開始!

不過項目組還有另外一個也同樣使用了Springboot,他們已經順利發布了,嗯~ 再百度一下, 哈哈哈,這還不是簡簡單單!

這個事情,隨手扔給下面的技術人員搞定就ok的嘛~   結果一周過去了,跟我說項目啟不來。沒任何反應 。   我???

這么簡單的事情都搞不定,我要你們何用?  於是我就大發慈悲,來幫幫你們吧~   我仿佛看到了 輕輕松松搞定后,他們對我投來的崇拜目光~

 

先把之前看到的那片文章找出來,認真研究一下。  這里感謝【書上有雲】的這篇文章【https://blog.csdn.net/qq_32734365/article/details/79295535】,幫助很大!

簡單說梳理一下思路,需要做如下事情:

1、將項目web調整為 servlet 2.5 ,並在pom.xml添加對應的支持依賴;

2、排除了自身的Tomcat,如果需要本地測試,則添加到provide中;

3、新增web.xml, contextConfigLocation 配置啟動類,新增weblogic.xml;

4、啟動類需要繼承SpringBootServletInitializer、實現WebApplicationInitializer接口,重寫configure方法;

5、在pom.xml中,將打包方式從jar改成war。

 

一切就緒,war成功編譯,然而發布到weblogic,還是啟動失敗!  what?   腫么不對呢?

只有一個醒目的錯誤:Caused By: java.lang.NoClassDefFoundError: javax/servlet/MultipartConfigElement

 

回想可以先在本地用Tomcat6 試試,於是就先開始用Tomcat6本地調試一下。

繼續把war包扔到Tomcat的webapp下面,啟動ing。。。。似乎沒有反應,查看log

嚴重: Exception sending context initialized event to listener instance of class org.springframework.boot.legacy.context.web.SpringBootContextLoaderListener
java.lang.NoClassDefFoundError: javax/servlet/MultipartConfigElement

 

棒棒噠! 最起碼問題復現了,其實這個問題好解決,Springboot默認版本是3.0,在pom.xml中添加 servlet的包,變成2.5 就行了。  ok! 問題1消滅!!!

重新打包,Tomcat完美運行,美滋滋~

 

再次扔到weblogic上面,又出來一個新的玩意:

Caused By:java.lang.ClassNotFoundException: org.osjava.sj.SimpleContextFactory

 

這是什么鬼? 似乎沒見過呀,百度一下,似乎就一個人提到這個問題,回答的也是敷衍沒實質作用。

嗯,還出了一個問題,weblogic控制台沒法進了。登錄就彈出這個提示:

已禁用所需的MBean服務器,這將阻止WebLogic管理控制台的正常操作,

請在該域的配置中啟用 DomainRuntimeMBean 服務器和 Edit MBean 服務器。

氮素,我重啟Weblogic服務后,居然神奇的可以訪問到項目了,這是什么騷操作。 一臉懵逼zzz?

 

可是這個問題不正常呀,清理到應用,重啟WebLogic,控制台又能順利進去了,再發布應用,卻怎么也啟不來。就開始不停地:

Caused By:java.lang.ClassNotFoundException: org.osjava.sj.SimpleContextFactory

於是就只能回歸項目代碼了,應該是代碼里面寫了什么或者用了什么神奇的東西。 

找到了這個類,原來是 simple-jndi jar包, 項目里面用kettle來實現數據同步,方便調整數據庫,便用到了這個jar包,采用jndi方式配置數據源。

 

新的曙光已經出現,怎么能夠停滯不前!  這個問題來來回回折騰好幾天了,是時候把它解決了!

又研究半天代碼,發現網上在寫kettle使用jndi方式里面,用的System的屬性定義, 感覺就是這個鬼了。

 System.setProperty("java.naming.factory.initial", "org.osjava.sj.SimpleContextFactory");

然后又去找了一下Java調用 WebLogic的JNDI,不同的容器使用的Context.INITIAL_CONTEXT_FACTORY是不一樣的,Weblogic需要用到如下:

System.setProperty("java.naming.factory.initial",   "weblogic.jndi.WLInitialContextFactory");

這樣,一切都明朗了!  我只需要配置weblogic的jndi,並且把simple-jndi的替換掉就OK了。

調整完畢,配置好JNDI,再部署應用,到此結束! 

 

其實,只要認真仔細分析,問題都有解決的辦法!  有相同或類似問題,歡迎留言探討~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM