專案從tomcat遷移到weblogic環境下問題彙總----不斷補充中ing...
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程式碼
-
javax.servlet.ServletContext
- getMajorVersion() //主版本號(2)
- 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程式碼
- org.springframework.web.context.support.WebApplicationContextUtils. getWebApplicationContext(ServletContext);
-
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程式碼
- Error: weblogic.management.DeploymentException: Cannot set web app root system property when WAR file is not expanded - with nested exception:
- [java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded]
- Error: weblogic.management.DeploymentException: Cannot set web app root system property when WAR file is not expanded - with nested exception:
- [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程式碼
- public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
- String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
- String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);
- String oldValue = System.getProperty(key);
- if (oldValue != null) {
- throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!");
- }
- String root = servletContext.getRealPath("/");
- if (root == null) {
- throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");
- }
- System.setProperty(key, root);
- servletContext.log("Set web app root system property: " + key + " = " + root);
- }
- public static void setWebAppRootSystemProperty(ServletContext servletContext) throws IllegalStateException {
- String param = servletContext.getInitParameter(WEB_APP_ROOT_KEY_PARAM);
- String key = (param != null ? param : DEFAULT_WEB_APP_ROOT_KEY);
- String oldValue = System.getProperty(key);
- if (oldValue != null) {
- throw new IllegalStateException("WARNING: Web app root system property already set: " + key + " = " + oldValue + " - Choose unique webAppRootKey values in your web.xml files!");
- }
- String root = servletContext.getRealPath("/");
- if (root == null) {
- throw new IllegalStateException("Cannot set web app root system property when WAR file is not expanded");
- }
- System.setProperty(key, root);
- servletContext.log("Set web app root system property: " + key + " = " + root);
- }
系統需要讀取webAppRootKey這個引數,所以在部署到WebLogic裡的時候,在web.xml中手動新增如下程式碼:
Xml程式碼
- <context-param>
- <param-name>webAppRootKey</param-name>
- <param-value>webapp.root</param-value>
- </context-param>
- <context-param>
- <param-name>webAppRootKey</param-name>
- <param-value>webapp.root</param-value>
- </context-param>
WebLogic自身也包含對Log4j的支援,在打包部署(.war)的時候,會和Spring的 org.springframework.web.util.Log4jConfigListener有衝突(拷貝到WebLogic散放部署不會出錯)。所以改用Servlet載入。(不通過應用載入Log4j好像也可以使用,但未進行完整測試,下面程式碼修改後,系統會報Log4j載入重複錯誤,不影響應用啟動。)
web.xml中刪除下面程式碼:
Xml程式碼
- <listener id="log4jConfigListener">
- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
- </listener>
- <listener id="log4jConfigListener">
- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
- </listener>
將Listener載入改為通過Servlet載入,再在web.xml增加:
Xml程式碼
- <servlet>
- <servlet-name>log4jConfigListener</servlet-name>
- <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </servlet>
- <servlet>
- <servlet-name>log4jConfigListener</servlet-name>
- <servlet-class>org.springframework.web.util.Log4jConfigServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
- </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程式碼
- <?xml version="1.0" encoding="UTF-8"?>
- <!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">
- <weblogic-web-app>
- <container-descriptor>
- <prefer-web-inf-classes>true</prefer-web-inf-classes>
- </container-descriptor>
- </weblogic-web-app>
- <?xml version="1.0" encoding="UTF-8"?>
- <!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">
- <weblogic-web-app>
- <container-descriptor>
- <prefer-web-inf-classes>true</prefer-web-inf-classes>
- </container-descriptor>
- </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有時也是這個,不要衝突) 看能否正