項目環境:
IDE MyEclipse 6
Websphere 6
項目使用框架 spring2.5 spring mvc hibernate3.0 jstl2.0 數據庫連接池用的c3p0,項目中大量應用了泛型
1)直接把現有的項目達成war包部署到WebSphere上,部署的步驟基本都一樣,折騰了半天,正與能進login登錄頁面了,但登錄後立馬報錯,某個bean沒有裝載。後來查看jvm日誌(我是用MyEclipse看的), 才知道是spring的配置問題,上網查到這個錯,有網友已經總結過了,"nested exception is org.xml.sax.SAXParseException: cvc-elt.1:找不到元素“beans”的聲明。",原因:
spring配置文件 引入DTD這種方式在websphere 6.1 下不成功,必須改成 使用schema這種方式。
DTD:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
- <beans default-autowire="byName">
修改爲SCHEMA:
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
重新部署,(哎!WebSphere這玩意部署起來還真是折騰人,慢死了)
2)開始出現傳說中的jdk版本不兼容的問題了,WebSphere用的是自家的jdk,6.1版本的jdk是1.5,到了WebSphere 7以後支持jdk1.6了(可以客戶買的就是6.1版,沒辦法)
錯誤 "....bad major version at offset=6"
將項目備份,Eclipse-->Preferences-->Java-->Compiler-->從6.0調到5.0,整個項目重新編譯(基本上有經驗的人士都推薦,這裏一定要調成和Websphere 兼容的JDK,不然鬼知道還要報多少錯呢), 項目一片紅叉,用查找替換了半天,終於不報錯了。用tomcat跑了一遍,沒問題。
再次重新部署
3)登錄進入首頁了,竟然能正常顯示,但進入一個模塊後報錯了,jsp無法編譯,不支持泛型
原因:
同時我也把網友的原文解決方法貼出來
找到下面的兩個文件:
<WAS-HOME>/profiles/AppSrv01/config/cells/<cellname>/applications/<appname>/deployments/<appname.war>/WEB-INF/ibm-web-ext.xmi
<WAS-HOME>/profiles/AppSrv01/installedApps/<nodename>/<appname>/<appname.war>/WEB-INF/ibm-web-ext.xmi
在最後面的 </webappext:WebAppExtension> 前添加下面一行:
- <jspAttributes xmi:id="JSPAttribute_113" name="jdkSourceLevel" value="15"/>
保存後重新啓動應用即可,也請同時刪除 jsp 已經編譯過的 class 文件:
<WAS-HOME>/profiles/AppSrv01/temp/<nodename>/<appname>/<appname.war>/*.class
這次不用重新部署了,重啓了Websphere服務器,大部分功能都能正常運行了,(部分頁面,由於調用了delphi寫的 library 出了點問題,明天接着調 ) 淚流滿面啊。
很多人寫web.xml的時候,部署在Websphere下出了問題,我在這一步上沒有遇到問題,除了spring配置文件的頂部命名空間有修改,web.xml沒有動過
再補充一些關於數據庫連接的問題,項目本身用的c3p0連接池,在WebSphere下運行時正常的。
c3p0連接池代碼
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
- <property name="driverClass"><value>${jdbc.driverClass}</value></property>
- <property name="jdbcUrl"><value>${jdbc.jdbcUrl}</value></property>
- <property name="user"><value>${jdbc.user}</value></property>
- <property name="password"><value>${jdbc.password}</value></property>
- <property name="minPoolSize"><value>${jdbc.minPoolSize}</value></property>
- <property name="maxPoolSize"><value>${jdbc.maxPoolSize}</value></property>
- <property name="maxIdleTime"><value>${jdbc.maxIdleTime}</value></property>
- </bean>
改成jndi方式連接,代碼如下
- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
- <property name="jndiName" value="jdbc/db2"/>
- <property name="resourceRef" value="true"/>
- </bean>
“jdbc/db2”就是WebSphere數據源的jndi名稱,在WebSphere下測試連接是正常的,可在項目中就會報錯
[jcc][t4][2013][11249][3.50.152] 發生了連接權限故障。原因:用戶標識或密碼無效
納悶了半天,這個jndi數據源的配置方法是參考的這篇文章:http://xiaoduan.blog.51cto.com/502137/124414
注意這篇文章裏後面關於用戶名密碼的方式,是增加了user和password的自定義屬性的。作者在Eclipse測試是成功的,但在我這是不成功的。
後來找到另外一種配置方式
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0512zhanghzh/
利用的數據源中的 JAAS - J2C 認證數據,增加了用戶名和密碼,並測試成功。在項目中重啓了WebSphere,連接成功。
這兩種方式暫時還沒有時間深入研究到底什麼原因,萬幸系統終於沒什麼大問題了
以下是項目遷移時參考過的url
WebSphere數據源
http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0512zhanghzh/
JDK版本不一致(錯誤bad major version at offset=6 This is often caused by having a class defined at multiple locations within the classloader hierarchy)
修正WebSphere jsp默認的1.3規範 編譯版本(讓 WAS V6.1 的 JSP 編譯器用 JDK5.0)
實際在遷移過程中還走了很多彎路,查的網頁也比上面列的多很多。其實遷移完成後發現Websphere也沒想象的那麼恐怖,主要是不熟悉造成的,這裏記錄下來供各位網友參考一下。
另外對WebSphere的實時調試,我還是沒弄好,好像是必須要建企業項目而不是一般web項目,所以我現在的修改還是在tomcat下修改,最後部署在WebSphere下面。修改量少的話,就不重新部署war包了(實在很慢),將修改的配置文件,或.class直接拷貝到Websphere的實際發佈目錄下替換,重啓WebSphere解決