首頁 > 軟體

WebLogic 部署問題定位與解決

2020-06-16 17:06:55

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


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