項目使用的是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,再部署應用,到此結束!
其實,只要認真仔細分析,問題都有解決的辦法! 有相同或類似問題,歡迎留言探討~
