這兩天因?yàn)橄霚y(cè)試一下群集Cache,用Myeclipse 建了一個(gè)測(cè)試程序,快把我折騰死了。
在Myeclipse的設(shè)計(jì)中,Project的粒度很細(xì)。EAR Project, WAR Project, 和EJB Project是三個(gè)不同的Project。它不支持EAR Project包打天下不太一樣。
我按照這個(gè)要求,創(chuàng)建了四個(gè)項(xiàng)目:EAR, WAR, EJB和一個(gè)公用的Pojo Project。
公司剛剛換用了SubVersion首先涮了我一把。Subeclipse 1.0.1只認(rèn)一個(gè)項(xiàng)目一個(gè)項(xiàng)目的check out。一下子把我的四個(gè)項(xiàng)目合并成一個(gè)什么都不是的大項(xiàng)目。 我只好把這個(gè)大項(xiàng)目關(guān)掉,再一個(gè)一個(gè)的導(dǎo)入進(jìn)來。
可是碰在新建Subversion庫的當(dāng)口上,項(xiàng)目的服務(wù)器路徑變動(dòng)了好幾次。每次都要我這么弄幾下。迫不得已,裝上TortoiseSVN-1.4.3。這東西爽!可以一下子把四個(gè)項(xiàng)目全取下來,而且不破壞eclipse項(xiàng)目結(jié)構(gòu)。
然而,當(dāng)我打開eclipse,又碰到一個(gè)經(jīng)典問題: subeclipse 1.0.1和TortoiseSVN-1.4.3不兼容,報(bào)告說我的subversion客戶端太老(其實(shí)是它自己老了),直接罷工了。
左找右找,終于發(fā)現(xiàn)有人說subeclipse 1.1.6搞定了這個(gè)問題。于是升級(jí),搞定了這個(gè)問題。
?
要說Myeclipse對(duì)于EJB和JSP的支持確實(shí)漂亮,輕輕松松的就開發(fā)完成了。部署并初步運(yùn)行也是成功的。
只有一個(gè)美中不足:它生成的war包和jar包不能指定名字。在EAR的.mymetadata中,有這么一段配置:
<
project-modules
>
<
project-module
type
="WEB"
name
="Cache?Web"
id
="myeclipse.1171417787608"
context-root
="/cache"
j2ee-spec
="1.4"
archive
="Cache?Web.war"
>
<
attributes
>
<
attribute?
name
="webrootdir"
?value
="/root"
?
/>
</
attributes
>
</
project-module
>
<
project-module
type
="EJB"
name
="Cache?Ejb"
id
="myeclipse.1171417692847"
j2ee-spec
="1.4"
archive
="Cache?Ejb.jar"
?
/>
</
project-modules
>
?
包名中帶空格可不是我的風(fēng)格。我嘗試修改上面的archive屬性。但是最后生成的EAR中,包名還是照舊。很有可能archive屬性根本就沒有作用。Myeclipse簡(jiǎn)單的拿工程名做包名。
?
沒辦法,將就過吧。繼續(xù)測(cè)試。Pojo是個(gè)單獨(dú)的Hibernate Pojo項(xiàng)目。EJB和JSP都有引用到。
在EJB中,調(diào)用Pojo得到一個(gè)List,里面的元素是Order對(duì)象。在EJB中從Object轉(zhuǎn)成Order成功。但在JSP中轉(zhuǎn)型時(shí),碰到一個(gè)極為古怪的問題:ClassCastException。
調(diào)用EJB得到List都成功了,可怎么從中轉(zhuǎn)出Order對(duì)象會(huì)出問題呢?打開Debug看看,List中的確是Order對(duì)象啊!太古怪了!
沒救了,死馬當(dāng)活馬醫(yī)吧。把遠(yuǎn)程EJB調(diào)用改成本地EJB調(diào)用——問題照舊!檢查所有配置文件,都簡(jiǎn)單得不可能出問題啊!
……神啊,救救我吧。
最后,在檢查部署后的文件時(shí)發(fā)現(xiàn)了問題。WAR包和EJB包各自把Pojo項(xiàng)目中的所有classs合并了進(jìn)來。這樣在一個(gè)EAR中,每個(gè)pojo的class都有兩份。JSP和EJB各引用各的,從而導(dǎo)致了類型不匹配。
問題的原因在于Myeclipse中指定的部署方法不對(duì)。為了省事,我在WAR和EJB的部署配置中,都選擇了“Merge dependent Java Project Delopyment"。如下圖所示。
將部署配置改為Ignore之后,然后手工將pojo包放到j(luò)boss server的lib中,問題終于解決了。
可是這樣一來,每次我都得手工的部署pojo包。在EAR的配置中有一個(gè)"Jar dependent Java projects"。選中它,并且在引用項(xiàng)目中選中Pojo項(xiàng)目。Myeclipse就會(huì)自動(dòng)將Pojo包部署到EAR中。
然而,它部署是部署了,沒把人家放到classpath中去,一運(yùn)行就報(bào)錯(cuò):ClassNotFound。這個(gè)問題好解決,在EJB和WAR的MANIFEST.MF中加入classpath就可以了。
一開始我用的是pojo.jar這個(gè)名字,放到classpath中后運(yùn)行成功。
可是Myeclipse在每次自動(dòng)生成pojo包時(shí),給的是工程名"cache pojo.jar",里面有個(gè)空格。classpath死活不認(rèn)識(shí)它,用引號(hào)引起來也不行。
問題到了最后,還是沒有圓滿解決——早知今日,我還不如直接用個(gè)ant building呢!