寫在前面,一個(gè)EAR包中可以包含若干個(gè)JAR包和WAR包。本demo的目錄結(jié)構(gòu)如下 :

看了一段時(shí)間的書,手開始癢癢,不料盡碰到一些古怪的問題,郁悶。
最近的一個(gè)是Eclipse不能自動(dòng)編譯甚至不能編譯java文件的問題。查了半天資料也無(wú)法解決。非常之郁悶。
只好重新開始新建工程,為了不出錯(cuò),對(duì)照一個(gè)demo開始了。
工程名就叫做ym(郁悶),選用最為流行的MyEclipse做為插件了。。。
以后還會(huì)發(fā)生什么問題,不得而知,從現(xiàn)在開始,無(wú)論成功失敗,記錄一下期間碰到的問題,以備后用(純屬個(gè)人經(jīng)驗(yàn),不對(duì)的地方請(qǐng)多指教)。
1.解決Eclipse自動(dòng)編譯失效問題
起因:
我想在EJB工程中使用WEB工程中定義的類,
比如在EJB工程中的UserManager中需要使用WEB工程中定義的com.earth.ejb3.ServiceLocator;直接import會(huì)出錯(cuò),
使用Ctrl+1提示Add project 'ymWeb' to build path of 'ymEJB',這樣代碼沒有問題了。
分析:
Eclipse自動(dòng)在EJB下的.classpath文件中加入了這樣一句:<classpathentry kind="src" path="/ymWeb"/>
這樣,在.classpath文件中同時(shí)有兩個(gè)src,另一個(gè)是<classpathentry kind="src" path="src"/>
我想這大概就是使Eclipse自動(dòng)編譯失效的原因。因?yàn)樽詮氖褂昧吮敬蜟trl+1功能后,java文件就不能自動(dòng)編譯了!
解決方法:
OK,經(jīng)過多次嘗試,最后找到了解決辦法:
如果在WEB工程中要使用EJB工程中定義的類,必須把EJB工程的output目錄加入到WEB工程的build path,
所以在WEB工程的.classpath中加入這樣一句
<classpathentry kind="lib" path="/ymEJB/classes"/>
反過來(lái)也一樣,在EJB工程的.classpath中加入這樣一句
<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
即互相把對(duì)方的output做為自己的lib
這是修改之后ymWeb的.classpath文件
<classpath>
?<classpathentry kind="src" path="src"/>
??????? ...
?<classpathentry kind="lib" path="/ymEJB/classes"/>
?<classpathentry kind="output" path="web/WEB-INF/classes"/>
</classpath>
這是修改之后ymEJB的.classpath文件
<classpath>
?<classpathentry kind="src" path="src"/>
?<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
?<classpathentry kind="con" path="com.genuitec.eclipse.j2eedt.core.J2EE14_CONTAINER"/>
?<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/jboss-ejb3"/>
?<classpathentry kind="lib" path="D:/SmartLibrary/commons/commons-lang.jar"/>
?<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
?<classpathentry kind="output" path="classes"/>
</classpath>
可以通過project->properties->Java Build Path->Libraries選項(xiàng)卡->Add Class Folder來(lái)完成上面的操作
2.
加入jar到lib目錄(隨同應(yīng)用一起發(fā)布)
lib右鍵->import->File system->選擇要導(dǎo)入的jar
加入jar到build path(不會(huì)發(fā)布)
project->properties->Java Build Path->Libraries選項(xiàng)卡->Add External JARs
3.避免頻繁啟動(dòng)jboss技巧。。。
4.在JAR包中無(wú)法調(diào)用WAR包中的class文件。所以要把WAR中公共的class文件打成一個(gè)JAR包
5.如何將新建的一個(gè)EJB Project commons-earth.jar包加入到ear中?
將commons-earth .mymetadata中的<project-module>拷貝到EAR .mymetadata <project-modules>中,
然后在EAR中的application.xml中加入如下代碼
?<module id="myeclipse.1154552687109">
??<ejb>commons-earth.jar</ejb>
?</module>
OK,太興奮了,加入user成功了。
睡覺去了,明天加入extremeTable。
6.見2:加入eXtremeComponents.jar到lib目錄,此時(shí)在war中可以調(diào)用,但在其它的jar包中無(wú)法調(diào)用,howto?
project->properties->Java Build Path->Libraries選項(xiàng)卡->Add JARs,選擇ymWeb/web/WEB-INF/eXtremeComponents.jar
還是不可行,jboss還是找不到它,郁悶,只好將這個(gè)jar包放到default/lib目錄下。reboot jboss
又提示找不到commons-StringUtils,,,,這些包全部都存在于ymWeb/web/WEB-INF/lib下,為什么會(huì)找不到?
7.<html:form>和<form>的一個(gè)小區(qū)別前者action="/userAction.do就可以了"后者要寫成action="/ym/userAction.do"
8.以前碰到過的問題,不要在form中用disabled="disabled"應(yīng)該使用readonly="readonly",只有后者的數(shù)據(jù)才會(huì)自動(dòng)組裝到ActionForm
9.解決亂碼問題,對(duì)于亂碼,一向是加過濾器,這次卻不行了。郁悶,最后查明原因。EJB3自動(dòng)建表使用了latin1 編碼。將表的默認(rèn)編碼改為utf-8,并且去掉表中每一字段的編碼。
最后還需要在mysql-ds.xml中設(shè)置jdbc:mysql://localhost:3306/message?useUnicode=true&characterEncoding=UTF-8,修改mysql-ds.xml后需要重新發(fā)布工程。
10以Packaged Archive的方式發(fā)布EAR包,修改文件后不用重啟jboss可進(jìn)行熱布署
11.ec自帶分頁(yè),能幫你計(jì)算出rowStart和rowEnd。
在本示例中,我用的是EJB3中的
Query.setFirstResult(limit.getRowStart()).setMaxResults(limit.getCurrentRowsDisplayed())
這樣ec中的分頁(yè)就與具體數(shù)據(jù)庫(kù)無(wú)關(guān)了。。。。。