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 時常見的幾個報錯異常(還有很多遇到在補充):

   01) java.lang.UnsupportedClassVersionError:  Unsupported major.minor version 51.0 

   weblogic Jdk 版本與項目 jdk 版本不一致

   02) request.getRealPath() 為 null 

   servlet-api.jar 本地和 weblogic 有差異,使用類加載 Thread.currentThread().getContextClassLoader() 獲取相對路徑;

  (classpath 下找不到 .doc 和 .exe ?可以讀取配置文件?)將資源放置到 WEB-INF 下;

   03) ClassNotFoundException:org.hibernate.hql.ast.HqlToken

   weblogic 已依賴較早版本的 antlr.jar

   04) 統一配置 tomcat 和 weblogic 上的數據源

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/user" />

   05) java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory cannot be cast to javax.xml.parsers.DocumentBuilderFactory

   移除項目 xml-apis.jar 或 jaxp-api.jar

   06)weblogic NoClassDefFoundError: Could not initialize class sun.awt.X11Graphi

   修改 startWebLogic.sh export JAVA_OPTIONS=-Djava.awt.headless=true

   07)weblogic.jdbc.wrapper.Clob_oracle_sql_CLOB cannot be cast to oracle.sql.CLOB 

   使用 weblogic JNDI 數據源讀取 clob 字段時出現的強轉錯誤:http://blog.csdn.net/arvinrong/article/details/22732219

   08) java.lang.NoSuchMethodError: com.google.common.collect.Lists.reverse(Ljava/util/List;)Ljava/util/List

   weblogic 依賴的 guava 版本較低(包含14.0.1 及以下)

   09)WebLogic下使用 URL.openConnection 獲取連接返回 SOAPHttpsURLConnection 而不是 HttpsURLConnection

   在實例化 URL 對象是指定JDK Handler new URL(null, urlStr, new sun.net.www.protocol.http.Handler.Handler())

   10)java.lang.LinkageError: loader constraint violation: when resolving method'XXXXX(XXXX)V'

    weblogic 類加載器和 JVM 類加載器加載了不同 Jar 的相同類導致沖突(刪除XXX所在jar):http://www.lxway.com/981865964.htm

   11)java.lang.NoSuchMethodError: javax.validation.spi.ConfigurationState.getParameterNameProvider()Ljavax/validation/ParameterNameProvider

    weblogic 依賴的 hibernate-validator 版本較低(包含 4.3.2.Final 及以下)

   12)java.lang.AbstractMethodError: org.hibernate.validator.internal.engine.ConfigurationImpl.getDefaultParameterNameProvider()Ljavax/validation/ParameterNameProvider;

    升級 hibernate-validator 版本

   13)java.lang.RuntimeException: Invalid schema document passed to AbstractDataBinding.addSchemaDocument, not in W3C schema namespace: schema

    com.sun.xml.bind.jaxb-impl 與 weblogic JDK jar 沖突,排除該 jar

   14)weblogic 解析 web.xml 時不支持通配符,類似於這種:spring-mvc*.xml

3. 解決方法

   解決此類問題的方式大體有三種,遇到部署問題時也可以自己都實踐一下。

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#WBAPP571

   關注其中的 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 上的應用出現問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM