2021-05-12 14:32:11
WebLogic 部署問題定位與解決
weblogic 做為商用中介軟體在(EJB、jndi 資料來源、紀錄檔管理、記憶體管理、資源設定管理...) 是一些開源免費小型容器無法望其項背的。
weblogic 最早由 weblogic Inc. 開發,後併入 BEA 公司,最終 BEA 公司又併入 Oracle 公司。
weblogic 是用於開發、整合、部署和管理大型分散式 Web 應用、網路應用和資料庫應用的 Java 應用伺服器。
因此 weblogic 一般做為專案上線發布和部署的伺服器,而本地研發時大多會選用 Tomcat/Jetty.... 小型容器。
這樣難免會出現問題,本地執行良好的 web 程式,部署在 weblogic 時會出現這樣或那樣的問題。
絕大一部分問題都是因為 weblogic 依賴的 jar 與專案中的 jar 衝突(相同 jar 不同版本)或 weblogic 不支援專案 jar 所導致的。
當部署 weblogic 出現問題時(自己總結三板斧):
1. 確認公司使用的 weblogic 版本並翻閱官網對應 weblogic 版本所支援的標準;
2. 對照 weblogic 出錯紀錄檔確定衝突 jar 或確定該 webloigc 不支援的 jar;
3. 對於出現衝突的 jar 在專案 WEB-INFO 目錄下新增 weblogic.xml 組態檔,其中申明要預先載入的專案 jar;
4. 對於出現該 webloigc 版本不支援的 jar,升級 weblogic 版本,或降低專案使用的 jar 版本。
1. 確定 weblogic 版本並檢視相應支援的標準
知已知彼才能百戰不殆,因 weblogic 小版本較多且版本之間差異較大。
檢視 weblogic 版本有很多方法,最直接方式是詢問安裝 weblogic 的同事,或者登入到 linux 像下面這樣。
獲悉部署的版本後,去瞅瞅 oracle weblogic 官網,那裡的文件資料是最全面也是最權威的。
http://www.oracle.com/technetwork/middleware/weblogic/documentation/index.html
找到對應版本點 view Library 跳轉進去,裡面是整個版本的概覽,咱們的關注點應該是該 weblogic 版本支援的標準。
裡面有詳細的該 weblogic 支援的 java、web Service、一些雜七雜八的標準,比如 JDK、EL、Servlet、JAX-RS、JAX-WS....
2. 對照部署報錯紀錄檔確定問題並解決
有了上述具體的支援標準,配合部署報錯的具體類和方法,就可以對症下藥。
下面列舉部署 weblogic 時常見的幾個報錯異常(還有很多遇到在補充):
1) java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0 (weblogic Jdk 版本與專案 jdk 版本不一致)
2) request.getRealPath() 為 null ( servlet-api.jar 本地和 weblogic 有差異,使用類載入 Thread.currentThread().getContextClassLoader() 獲取相對路徑)
3) ClassNotFoundException:org.hibernate.hql.ast.HqlToken (weblogic 已依賴較早版本的 antlr.jar)
4) 統一設定 tomcat 和 weblogic 上的資料來源 jndi : <jee:jndi-lookup id="dataSource" jndi-name="jdbc/user" />
5) java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory (移除專案 xml-apis.jar)
6 )weblogic NoClassDefFoundError: Could not initialize class sun.awt.X11Graphi( 修改 startWebLogic.sh export JAVA_OPTIONS=-Djava.awt.headless=true)
解決此類問題的方式大體有三種,遇到部署問題時也可以自己都實踐一下。
a. 刪除 weblogic 下衝突 jar 資料夾:
(1)刪除 /bea/weblogic12.1.3/server/lib/weblogic.jar中的衝突的資料夾;
(2)copy 衝突的 XXX.ja r到 /bea/weblogic12.1.3/server/lib, 重新啟動weblogic。
b. 通過修改啟動指令碼來優先載入某些 jar
(1)將衝突的 jar 包拷貝到 ${DOMAIN_HOME}/lib 目錄下。
(2)${DOMAIN_HOME}/bin 下找到 startWeblogic.sh 檔案用文字編輯器將其開啟,並在裡面加入如下內容:
export first_classpath=${DOMAIN_HOME}/lib/xxxx.jar
SAVE_CLASSPATH="${first_classpath}:${CLASSPATH}"
c. 在應用中通過 weblogic .xml 的設定,優先載入應用的 jar
因 weblogic 版本不用,weblogic 的設定項會有差異,不要盲目從網上 copy。
官網版本描述(其他版本將1213換一下即可):http://docs.oracle.com/middleware/1213/wls/WBAPP/weblogic_xml.htm
關注其中的 prefer-application-resources/prefer-application-packages(預先載入應用對應 jar ) 節點的設定:
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app">
<container-descriptor>
<prefer-web-inf-classes>false</prefer-web-inf-classes>
<prefer-application-packages>
<package-name>預先載入專案 lib 中的包名,支援萬用字元</package-name>
<package-name>com.sun.faces.*</package-name>
<package-name>com.bea.faces.*</package-name>
</prefer-application-packages>
</container-descriptor>
</weblogic-web-app>
解決方案 a/b/c 中, c 方案無異是最優解,做為生產環境的 weblogic 可能會部署多個應用,不太可能讓你隨便重新啟動。
方案 a,b 會破壞 weblogic 的整體性,可能導致其他部署在 weblogic 上的應用出現問題。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2017-09/147018.htm
相關文章