首頁 > 軟體

解決springboot 部署到 weblogic 中 jar 包衝突的問題

2022-08-11 22:00:10

背景

某專案,客戶要求使用已有的 weblogic 部署已經開發好的 springboot,於是乎對 springboot 進行了部分設定的調整,主要包括去除 tomcat 依賴,增加啟動類的處理。

一般都會比較順利,實際上總會遇到些小問題。

本文不贅述如何在 weblogic 中部署專案,如果你有需要,可以存取https://www.jb51.net/article/218458.htm 參考該文章。

問題1

打包後釋出到 weblogic 上啟動時,如下圖所示的錯誤:

從異常內容可以很容易判斷出,這是 jar 包衝突導致的錯誤。

經過定位,weblogic 有個目錄 wls12213oracle_commonmodulesthirdparty,其中存放了一些第三方的預設的 jar 包,專案啟動過程中預設是先載入這裡的 jar 包,再載入專案工程中的 jar 包,因為你無法保證專案工程中的 jar 包和 weblogic 中的 jar 包版本剛好一致,所以就因為 jar 包版本不一致出現了比較常見的類載入衝突的問題。

查閱官網資料,weblogic 也有是解決方案的,可以通過新增並設定 weblogic.xml 檔案來定義哪些類需要優先從專案工程包的 jar 包中載入。

設定方法如下:

在 springboot 專案程式碼和 resource 同級建立一個 webapp 目錄,然後再 webapp 目錄下建立 WEB-INF 目錄,將 weblogic.xml 檔案放在 WEB-INF 中,以 springboot-weblogic-demo 工程為例它的完整路徑就是 springboot-weblogic-demo\srcmainwebappWEB-INFweblogic.xml,其內容如下:

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd">
    <container-descriptor>
        <prefer-application-packages>
            <package-name>org.slf4j</package-name>
            <package-name>javax.validation.*</package-name>
            <package-name>org.hibernate.*</package-name>
            <package-name>javax.el.*</package-name>
            <package-name>org.springframework.*</package-name>
            <!--解決專案中jackson的jar包和weblogic中thirdparty的jar包衝突問題,設定優先載入專案中的jar-->
            <package-name>com.fasterxml.jackson.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
    <context-root>/springboot-weblogic-demo</context-root>
</weblogic-web-app>

僅僅是新增設定了這一個檔案,沒有其他什麼設定了,網上說的那些新增 web.xml 的操作,我這裡並沒有新增,範例是基於 springboot 2.7.2 正常部署執行。

問題2

部署的過程中還出現了 GC 錯誤 GC overhead limit exceeded,這個問題比較容易解決,給 weblogic 啟動環境修改記憶體值,調大一些即可。

修改對應檔案 D:weblogicfmw_12.2.1.3.0_wls_quick_Disk1_1of1wls12213user_projectsdomainsbase_domainbinsetDomainEnv.cmd,大約在 200 行出頭的位置,修改後的內容如下:

if NOT "%JAVA_VENDOR%"=="HP" (
	if "%VM_TYPE%"=="HotSpot" (
		set WLS_MEM_ARGS_64BIT=-Xms1024m -Xmx4096m
		set WLS_MEM_ARGS_32BIT=-Xms256m -Xmx512m
	)
)

重啟 weblogic 服務,最開始就能看到我們修改後剩下的記憶體設定:

WLS_MEM_ARGS_64BIT 的原始值為 -Xms256m -Xmx512m,或者你也可以追加更多關於記憶體的設定,例如:-Xms512m -Xmx1024m -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m

我寫好的 springboot-weblogic-demo 範例工程程式碼的地址:https://github.com/xzxiaoshan/springboot-weblogic-demo

到此這篇關於springboot 部署到 weblogic 中 jar 包衝突的文章就介紹到這了,更多相關springboot 部署weblogic  jar 包衝突內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com