1. 程式人生 > >專案從tomcat遷移到weblogic環境下問題彙總----不斷補充中ing...

專案從tomcat遷移到weblogic環境下問題彙總----不斷補充中ing...

1、 JDK和Servlet版本問題 

WebLogic 8.1 sp4以前(包括sp4)只支援JDK1.4,建議使用JDK1.4進行編譯程式碼,有時JDK1.5編譯的程式無法執行,由於WebLogic 8.1不支援J2EE1.4,不要使用Servlet2.4和JSP2.0進行編碼。 

比如:在tomcat下程式碼裡中可以有response.setCharacterEncoding("UTF-8")方法,這是servlet2.4的方法,所以要釋出到weblogic上需要把此方法註釋掉。 

另外關於檢視weblogic支援的servlet版本方法如下: 
Java程式碼  收藏程式碼
  1. javax.servlet.ServletContext   
  2. getMajorVersion()  //主版本號(2)  
  3. getMinorVersion()  //次版本號 (3)  

結果分別為2、3的話就說明,版本號為 servlet2.3 


2、 web.xml 中的啟動載入問題 

在TOMCAT中,載入Struts的順序是通過servlet載入,排在Listener載入之後。如果在Struts中使用Plugin,會在TOMCAT啟動的最後載入,所以在Plugin中可以使用Spring中的Bean。 

移植到WebLogic後,Struts會在容器啟動的時候全部載入,包括Plugin。這樣就出現了在Plugin載入的時候,不能得到 Spring管理的Bean,也就是說Struts Plugin在WebLogic裡不能使用Spring管理的Bean。所以如果需要啟動時載入部分程式碼,建議使用Servlet init()方法。 


Spring為通過Web啟動的程式提供了一個工具,該工具可以從Context中直接得到WebApplicationContext,其工具的方法簽名如下: 
Java程式碼  收藏程式碼
  1. org.springframework.web.context.support.WebApplicationContextUtils. getWebApplicationContext(ServletContext);     
  2. org.springframework.web.context.support.WebApplicationContextUtils. getWebApplicationContext(ServletContext);  


3、 JSP 的 Include問題  (建議使用動態引入)

在BEA WebLogic中不允許在一個檔案中出現一次以上類似<%@ page contentType="text/html; charset=GBK"%>的程式碼,所以使用include file時,請將被include的檔案中類似程式碼刪除。 

在TOMCAT時允許上述程式碼出現多回,並且使用include file時,被include的檔案中,不包含上述程式碼,編譯後客戶端顯示為亂碼。BEA為此解釋為TOMCAT不符合J2EE規範。 

為了增加程式碼的通用性和可移植性,建議使用<jsp:include>方式。 
<jsp:include>將被include的jsp程式碼視為獨立存在的檔案,所以可以在不同檔案內使用多個<%@ page contentType="text/html; charset=GBK"%>。<jsp:include>直接傳參由<jsp:param>標籤完成,在被 include頁面可以通過request得到傳入的值,也可以通過request.setAttribute()、 request.getAttribute()進行內外檔案引數傳遞。


4、 對Log4j支援問題 

打包成.war部署到WebLogic後,出現如下問題: 
Java程式碼  收藏程式碼
  1. Error: weblogic.management.DeploymentException: Cannot set web app root system property when WAR file is not expanded - with nested exception:      
  2. [java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded]     
  3. Error: weblogic.management.DeploymentException: Cannot set web app root system property when WAR file is not expanded - with nested exception:   
  4. [java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded]   


問題解決:通常您不需要親自編寫servlet或者listener,比如直接利用log4j的 com.apache.jakarta.log4j.Log4jInit類,Spring的 org.springframework.web.util.Log4jConfigServlet和 org.springframework.web.util.ServletContextListener方式配置,找到.Log4jConfigServlet和ServletContextListener的原始碼,他們都在適當的地方(callback method)呼叫了Log4jWebConfigurer.initLogging(getServletContext());定位到這個方法,第一句就是:WebUtils.setWebAppRootSystemProperty(servletContext);再定位到該方法,方法很短: 

Java程式碼  收藏程式碼
  1. public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {      
  2. String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);      
  3. String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);      
  4. String oldValue = System.getProperty(key);      
  5. if (oldValue != null) {      
  6. throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!");      
  7. }      
  8. String root = servletContext.getRealPath("/");      
  9. if (root == null) {      
  10. throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");      
  11. }      
  12. System.setProperty(key, root);      
  13. servletContext.log("Set web app root system property: " + key + " = " + root);      
  14. }     
  15. public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {   
  16. String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);   
  17. String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);   
  18. String oldValue = System.getProperty(key);   
  19. if (oldValue != null) {   
  20. throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!");   
  21. }   
  22. String root = servletContext.getRealPath("/");   
  23. if (root == null) {   
  24. throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");   
  25. }   
  26. System.setProperty(key, root);   
  27. servletContext.log("Set web app root system property: " + key + " = " + root);   
  28. }   

系統需要讀取webAppRootKey這個引數,所以在部署到WebLogic裡的時候,在web.xml中手動新增如下程式碼: 

Xml程式碼  收藏程式碼
  1. <context-param>      
  2. <param-name>webAppRootKey</param-name>      
  3. <param-value>webapp.root</param-value>      
  4. </context-param>     
  5. <context-param>   
  6. <param-name>webAppRootKey</param-name>   
  7. <param-value>webapp.root</param-value>   
  8. </context-param>   

WebLogic自身也包含對Log4j的支援,在打包部署(.war)的時候,會和Spring的 org.springframework.web.util.Log4jConfigListener有衝突(拷貝到WebLogic散放部署不會出錯)。所以改用Servlet載入。(不通過應用載入Log4j好像也可以使用,但未進行完整測試,下面程式碼修改後,系統會報Log4j載入重複錯誤,不影響應用啟動。) 

web.xml中刪除下面程式碼: 
Xml程式碼  收藏程式碼
  1. <listener id="log4jConfigListener">      
  2. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>      
  3. </listener>     
  4. <listener id="log4jConfigListener">   
  5. <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>   
  6. </listener>   

將Listener載入改為通過Servlet載入,再在web.xml增加: 
Xml程式碼  收藏程式碼
  1. <servlet>      
  2. <servlet-name>log4jConfigListener</servlet-name>      
  3. <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>      
  4. <load-on-startup>0</load-on-startup>      
  5. </servlet>     
  6. <servlet>   
  7. <servlet-name>log4jConfigListener</servlet-name>   
  8. <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>   
  9. <load-on-startup>0</load-on-startup>   
  10. </servlet>   


5、 Hibernate3、Axis部署問題 

Hibernate3中hibernate.query.factory_class的預設值為 org.hibernate.hql.ast.ASTQueryTranslatorFactory,在WebLogic下系統執行時會丟擲 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken異常。 

這個問題網上說的很多,解決方法也各式各樣,其實很簡單,Weblogic系統預設載入EJB-QL parser,存在重名類,所以使用時會出現ClassNotFoundException。一般網上的修改方式都是修改startWebLogic執行的指令碼,將antlr-2.7.5H3.jar檔案優先載入。但這樣的方法會帶來一些其他問題,所以不推薦使用。最好的方法是,在WEB-INF目錄下建一個weblogic.xml檔案,檔案中寫入如下程式碼: 
Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>      
  2. <!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">      
  3. <weblogic-web-app>      
  4.   <container-descriptor>      
  5.     <prefer-web-inf-classes>true</prefer-web-inf-classes>      
  6.   </container-descriptor>      
  7. </weblogic-web-app>     
  8. <?xml version="1.0" encoding="UTF-8"?>   
  9. <!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">   
  10. <weblogic-web-app>   
  11.   <container-descriptor>   
  12.     <prefer-web-inf-classes>true</prefer-web-inf-classes>   
  13.   </container-descriptor>   
  14. </weblogic-web-app>   

說明:prefer-web-inf-classes=true是WebLogic's classloader在有重名類時,優先載入Web應用中WEB-INF內的類。 

Axis部署同理。 


注意: 

1、如果有包在通過修改startWebLogic啟動指令碼優先載入後,web應用中有重複的包,並且將prefer-web-inf- classes=true,BEA WebLogic編譯JSP時會報錯。(直接設定true就可以,無需再修改指令碼;如果已經修改過指令碼,需要還原。) 

2、在apache中提供兩種方式部署Axis包,一種為prefer-web-inf-classes=true,另外一種將saaj.jar一個包在webservices.jar之前優先載入。經實際驗證,只將saaj.jar一個包優先載入並不能解決全部問題,如果不使用前一種方法,請將 axis全部的包載入在webservices.jar之前。 


6、 BEA WebLogic Crashes問題 

在實際部署到Unix下的BEA時,我遇到過兩回WebLogic Crash問題,都是通過BEA Support解決的,下面分享一下兩回Crash的過程、解決方法及經驗。 

伺服器環境:HP Unix 11.23;HP JDK1.4.2_10;WebLogic8.1 SP5 

7.       釋出Web Service介面,遠端程式呼叫兩回後BEA WebLogic Crash 

在Tomcat上測試正常的Web Service介面,移植到BEA 後,第一回呼叫該介面一切正常,第二次呼叫時,系統直接報錯,WebLogic程序從系統中消失。 


BEA Support給出的解釋是記憶體分配不足,增加BEA WebLogic應用記憶體最大值後,系統正常。 

8.     Axis遠端呼叫.net Web Service介面,出現java.lang.NoSuchMethodError: javax.xml.namespace.QName.getPrefix()Ljava/lang/String;錯誤,將包含該類的包優先載入,呼叫.net Web Service介面時系統Crash 

我所用的應用系統需要呼叫遠端.net平臺的Web Service介面,該程式在Tomcat和Windows 下BEA WebLogic 8.1 SP5下進行測試,全部正常使用,但移植到HPUX上,每次呼叫介面時都會找不到 javax.xml.namespace.QName.getPrefix()方法。查明該方法存在於jaxrpc.jar檔案中,而 webservices.jar存在名為javax.xml.namespace.QName的重名類。在startWebLogic.sh檔案中修改,手動將jaxpc.jar排在webservices.jar之前載入,重啟系統後,呼叫.net Web Service時出現Crash。 


BEA Support給的解釋是classloader衝突,確切的衝突原因不明,Windows下沒有問題的話考慮升級JVM,或者使用Application內的Class優先載入。 

最後通過問題4的解決方式解決。(詳細原理請參見http://e-docs.bea.com/wls/docs81/programming/classloading.html) 


個人感覺在UNIX下BEA不是很穩定,如果類似出Crash問題,最好請BEA Support解決。BEA Support定位問題需要出現問題的原因、出錯生成的日誌檔案,並且配合他修改一些引數獲得更多的日誌檔案,這些日誌檔案都在啟動的Domain目錄下。當購買BEA服務後,不建議過多花費時間在解決這類問題上(網上基本沒有太多資料)。 

9. 還有this.getServletContext()要改為this.getServletConfig().getServletContext() 


網路採集表明出處是種美德,原文參見:http://feicer.iteye.com/blog/561933

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



1、異常:在weblogic報java.lang.StringIndexOutOfBoundsException: String index out of range: -1

相關推薦

專案tomcat遷移weblogic環境問題彙總----不斷補充ing...

1、 JDK和Servlet版本問題 WebLogic 8.1 sp4以前(包括sp4)只支援JDK1.4,建議使用JDK1.4進行編譯程式碼,有時JDK1.5編譯的程式無法執行,由於WebLogic 8.1不支援J2EE1.4,不要使用Servlet2.4和JSP2.0進

Java web專案tomcat轉為weblogic環境所遇到的問題

最近公司需要將原本在tomcat上開發的專案部署在weblogic上執行,因為原先對weblogic沒有接觸,不知道tomcat和weblogic的主要區別,只能邊學邊找資料,所以避免不了走了許許多多的彎路。網上的資料可能因為版本、環境的不一致,無法解決問題。

Web專案Tomcat遷移weblogic 10.3出現的錯誤

第1個問題: 異常描述:VALIDATION PROBLEMS WERE FOUND problem: cvc-enumeration-valid: string value '3.0' is not a valid enumeration value for web-

tomcat+jdk的環境部署簡單的java web專案

初學者,先作下記錄: 1、下載tomcat:https://tomcat.apache.org/,下載jdk,兩者版本要相匹配; 2、下載mysql-connector-java的jar包:https://dev.mysql.com/downloads/connector/j/; 3、解

Solr6.0與Jetty、Tomcat在Win環境搭建/部署

rt.jar Language 管理 tom 增強 .net jet 還在 摘要 摘要: Solr6的新特性包括增強的edismax,對SQL更好的支持——並行SQL、JDBC驅動、更多的SQL語法支持等,並且在Solr6發布以後,Solr5還在持續更新,對於想嘗鮮Solr

我將系統Windows遷移至Linux的點點滴滴

一、寫在最前   由於本人的技術水平有限,難免會出現錯誤。本文對任何一個人有幫助都是我莫大的榮幸,任何一個大神對我的點撥,我都會感激不盡。 二、技術選型   在2013年8月低的時候,公司中了XXX市場監督局肉品配送車輛監控的專案。整個系統軟體部分需要實現的功能不難,最大的難點就是伺服器的系統要求是Li

Tomcat在Linux環境啟動異常 java.net.UnknownHostException: HP_MAIN12: HP_MAIN12

剛開發完一個專案,在本地部署的時候沒有任何異常,到Linux系統就出現這樣那樣的問題,下面就是其中一個: Tomcat在Linux平臺下啟動的時候丟擲java.net.UnknownHostException: HP_MAIN12: HP_MAIN12異常: 2014-01-09 11:04:26,609 

gradle 專案eclipse 遷移到idea筆記

偶然心血來潮,想換個開發工具。 切換髮現gradle 一大堆jar包沒引用過來 首先要新增idea外掛 以前只有eclipse apply plugin: 'eclipse' apply plu

CXF在AIX+Weblogic環境出現包衝突問題

專案中碰到一個問題,折騰了半天才終於解決,記錄一下: 環境:AIX作業系統     JDK1.7(IBM)     Weblogic(10.3.3)     Informix 專案架構是Struts2.3.15.1+Spring3.2.3.RELEASE+Hibernat

關於Linux環境應用生成圖片出現亂碼的問題處理

緣由:測試環境和生產環境系統字符集都是LANG=en_US.utf8,程式在測試環境通過下述方式生成的圖片裡面的中文可以正常顯示,生產環境不行,排查原因為生產環境確認對應的字型,採取後續方法增加字型。 1、C:\Windows\Fonts下找到字型檔案simsun.ttc,重新命名為sim

【自我吐槽】mac環境python安裝pandas遇到的坑總結

最近在做金融建模方面的工作,用到numpy、scipy、pandas包,但是在下載過程中可謂是一波n折,特此總結一下,希望能幫看到這篇博文的人解決一些問題。 我一開始安裝了pip,直接在終端裡用命令列成功下載了numpy,感覺非常開心。但是接下來下載pandas就遇到了第

win10環境,關於pycharm完成tensorboard的命令

在(venv) D:\Program Files\JetBrains\PycharmProjects\project01>後輸入tensorboard --logdir=logs,即(venv) D:\Program Files\JetBrains\PycharmPro

windows 環境在anaconda 3安裝python2和python3兩個環境(python2和python3共存)

博主本人是在學習機器學習的過程當中,看到的相關書籍使用的python 版本不一,但又想將每個版本都懂能使用一番,接下來,博主給大家介紹一個比較簡單方便的方式: 首先:安裝python 環境,極力推薦使用anaconda,Anaconda 是 Python 的

Nacos(五):多環境如何“讀取”Nacos相應的配置

前言 前景回顧: Nacos(四):SpringCloud專案中接入Nacos作為配置中心 Nacos(三):Nacos與OpenFeign的對接使用 Nacos(二):SpringCloud專案中接入Nacos作為註冊中心 通過前面幾篇介紹,已經基本瞭解了Nacos做為註冊中心和配置中心的基本用法。 在

大資料面試題彙總(不斷更新)

    結合自身面試經歷,包括BAT、SF、中信等等公司所做的面試題彙總。主要包括以下幾大類:一、spark相關1.Spark的Shuffle原理及調優?2.hadoop和spark使用場景?3.spark如何保證宕機迅速恢復?4.hadoop和spark的相同點和不同點?5

vmware ubuntu環境部署java專案時安裝jdk 與Tomcat的問題總結

win7下vmware虛擬網絡卡顯示未識別網路的解決 https://yq.aliyun.com/articles/5138 VMware Network Adapter VMnet1和VMnet8 被防火牆認定為[未識別的網路-公用網路],阻隔,無法使用埠對映,虛擬機器的80埠無

Linux環境更換Tomcat執行的專案

首先需要進入Tomcat的bin目錄下去使用./shutdown.sh命令去關閉當前tomcat,但是由於關不完全,所以還需要用到如下的命令 檢視當前執行專案,然後再使用如下命令關掉tomcat -9後面的引數是每次都會產生變化的,所以這個是需要自己手動去觀察輸入

eclipse環境部署到Tomcat專案目錄缺失class檔案或者不更新

首先要確定project選項裡的Build Automatically勾選上了(自動編譯)。 因為在專案中可能存在一些問題,比如說maven Install 中有錯誤但沒有發現,就會導致eclipse在編譯中出現錯誤而跳過。 在專案的proprites選項中如下圖配置,將Abort buil

eclipse環境如何配置tomcat,並且把專案部署到Tomcat伺服器上

eclipse環境下如何配置tomcat 開啟Eclipse,單擊“Window”選單,選擇下方的“Preferences”。 單擊“Server”選項,選擇下方的“Runtime Enviro

windows環境使用jenkins自動部署釋出專案部署到tomcat webapps資料夾

1、首先在windows環境下安裝好jenkins(在此之前首先做到此專案是maven專案,並且已經可通過eclipse上傳和更新svn倉庫程式碼),在瀏覽器輸入localhost:8080/ (jenkins預設埠號是8080,tomcat有時也是這個,不要衝突) 看能否正