將應用部署在weblogic及oracle linux 環境碰到的問題記錄

來源:互聯網
上載者:User

文章首發在我在javaeye上的blog(http://mr-caochong.iteye.com/blog/1013949)

 

 

到了這裡沒表格了, 各位將就著看吧

 

 

公司一個項目準備在這幾天上線,在使用者現場搭建好伺服器運行環境後,我們的主要工作就是將應用移植到新的環境中。

 

 

 

 

 

部署環境介紹

開發環境介紹

作業系統

Oracle Enterprise-R5-U5-Server-x86_6

windows7/windowsxp

中介軟體

Weblogic server 10.3

tomcat 6

JDK

jdk1.6

jdk1.6

J2EE SDK

5.0

5.0

資料庫

Oracle

Oracle

 

 

 在將tomcat環境下開發的應用移植到weblogic下的過程中遇到了各種問題,特在此記錄。

 

 

一、在一開始時準備將web應用打成war包,使用weblogic管理伺服器安裝,遇到了第一個問題

 

 

錯誤一:

意外的異常 在處理請求時出現意外的異常情況

訊息:

堆疊追蹤:  java.lang.NullPointerException

at com.bea.console.actions.app.install.Flow.uploadApp(Flow.java:256)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

省略數千字……………

錯誤二:

 java.lang.OutOfMemoryError: unable to create new native thread

 

 

 


 

問題分析:

    這些錯誤都是在檔案上傳時,因為我們的工程較大,導致虛擬交換記憶體不足引起的,將修改weblogic的虛擬記憶體調大後,解決了問題。

解決辦法:

    找到weblogic開機檔案 startWebLogic.sh,由於該檔案實際上又調用了bin/setDomainEnv.sh檔案,所以真正要改的是setDomainEnv.sh(在我這裡該檔案位於/Middleware/user_projects/domains/base_domains/bin)

將PermSize 和MaxPermSize調整到 256和 512(按實際需要來調)

 

二、這時候,我們這樣可以沒問題了吧,誰知一部署,第二個問題來了

 

 

錯誤:

java.lang.IllegalStateException: Cannot set web app root system property when WAR file is not expanded

 


問題分析:

    出現這個原因是因為部署的時候使用的是war包, weblogic部署應用不像tomcat先將war解壓在啟動,而是直接使用war啟動。因為我們在很多JSP和Servlet檔案中使用了如:this.servletContext.getRealPath("/")等類似寫法,因為在war中的檔案時沒有真實路徑的,所以getRealPath("/")取出來的都是意向不到的值,例如null。

解決辦法:

    由於用這種寫法獲得web伺服器路徑的地方很多,一個個去換顯然不是一個很好的辦法,而且直接使用war部署對後續的應用程式更新也比較麻煩,所以準備採用另外一種部署方式,就是檔案目錄部署。

 

 

三、檔案目錄部署

 

    使用檔案目錄部署指的是用weblogic管理伺服器安裝,直接指定本地的應用檔案夾,只要該檔案夾下面有包含WEB-INF/web.xml,就可以被選中安裝。

    所以接下來就是建立應用程式的安裝目錄。

在區別於weblogic域管理目錄路徑,我們在根路徑建立了目錄。

/deploy/applications/app

/deploy/applications/plan

app : 準備用來存放app應用,在檔案夾建好以後,將我們的應用(如:wzfy)整個檔案夾拷貝到app下面。

plan : 這個檔案夾當weblogic管理伺服器安裝了app下面的應用後,會在這裡自動建立app的部署計劃檔案。

在管理伺服器中,找到目錄/deploy/applications/app ,選中wzfy,開始安裝。第三個問題出現

 

 

無法訪問選定應用程式。

Exception in AppMerge flows' progression

Exception in AppMerge flows' progression

[J2EE:160111]ERROR: Appc can not write to the working directory, '/deploy/applications/app/wzfy'. Please ensure that you have write permission for this directory and try again.

 

 

    通過文字意思的理解,就是對於操作使用者來說/deploy/applications/app/wzfy是不可寫的。

奇怪,我們手動建立目錄都是可寫的呀?怎麼用webLogic Server安裝就變成不可寫了呢。

一想,我們建立使用者用的root使用者,目錄操作肯定沒問題,而我webLogic Server登入的使用者如果沒有授權肯定是沒有這個許可權。於是給webLogic Server使用者 weblogic授予對目錄/deploy/applications/的存取權限。

 

    授權方法如下:

 

chown –Rf weblogic:weblogic /deploy/applications

 

    授權後,安裝部署,一路走下來,非常順利,直到啟動wzfy,第四個問題出現

 

四、建立sessionFactory失敗

 

 

weblogic.application.ModuleException:

[HTTP:101216]Servlet: "context" failed to preload on startup in Web application: "wzfy". org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed;

nested exception is org.hibernate.HibernateException:

Errors in named queries: queryViewByModuleID, querySecParentOwnerById,

中間省略數千字………………………………………………………………………

at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364)

 

 

問題分析:

     碰到這個問題後,一頭霧水,這怎麼解決呢,第一想法是可能因為我們在hibernate中對應檔中使用name queries(命名查詢)的方式,會不會是weblogic不認呢?通過google和baidu了很多資料,很試了很多方法,都已失敗告終,最後在發現了有一個哥們在blog中總結的一段內容,問題解決。

 

 

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 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部署同理。

 

 

 

    至此,問題徹底解決,感謝很多熱心的網友,將自己解決問題的方法寫出來,貢獻給廣大勞動人民,所以我也準備將今天解決的問題總結一下,放到blog裡,希望能給遇到同樣問題的朋友提供一些協助。

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.