項目使用的是Springboot,以前直接使用JAR包的方式發佈,但在客戶這邊實施發佈的時候,客戶使用的容器是weblogic,版本爲 10.3.6。 痛苦就此開始!java
不過項目組還有另一個也一樣使用了Springboot,他們已經順利發佈了,嗯~ 再百度一下, 哈哈哈,這還不是簡簡單單!web
這個事情,隨手扔給下面的技術人員搞定就ok的嘛~ 結果一週過去了,跟我說項目啓不來。沒任何反應 。 我???spring
這麼簡單的事情都搞不定,我要大家何用? 因而我就大發慈悲,來幫幫大家吧~ 我彷彿看到了 輕輕鬆鬆搞定後,他們對我投來的崇拜目光~數據庫
先把以前看到的那片文章找出來,認真研究一下。 這裏感謝【書上有云】的這篇文章【https://blog.csdn.net/qq_32734365/article/details/79295535】,幫助很大!服務器
簡單說梳理一下思路,須要作以下事情:app
一、將項目web調整爲 servlet 2.5 ,並在pom.xml添加對應的支持依賴;webapp
二、排除了自身的Tomcat,若是須要本地測試,則添加到provide中;ide
三、新增web.xml, contextConfigLocation 配置啓動類,新增weblogic.xml;測試
四、啓動類須要繼承SpringBootServletInitializer、實現WebApplicationInitializer接口,重寫configure方法;ui
五、在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,再部署應用,到此結束!
其實,只要認真仔細分析,問題都有解決的辦法! 有相同或相似問題,歡迎留言探討~