写在前面,一个EAR包中可以包含若干个JAR包和WAR包。本demo的目录结构如下 :
看了一段时间的书,手开始痒痒,不料尽碰到一些古怪的问题,郁闷。
最近的一个是Eclipse不能自动编译甚至不能编译java文件的问题。查了半天资料也无法解决。非常之郁闷。
只好重新开始新建工程,为了不出错,对照一个demo开始了。
工程名就叫做ym(郁闷),选用最为流行的MyEclipse做为插件了。。。
以后还会发生什么问题,不得而知,从现在开始,无论成功失败,记录一下期间碰到的问题,以备后用(纯属个人经验,不对的地方请多指教)。
1.解决Eclipse自动编译失效问题
起因:
我想在EJB工程中使用WEB工程中定义的类,
比如在EJB工程中的UserManager中需要使用WEB工程中定义的com.earth.ejb3.ServiceLocator;直接import会出错,
使用Ctrl+1提示Add project 'ymWeb' to build path of 'ymEJB',这样代码没有问题了。
分析:
Eclipse自动在EJB下的.classpath文件中加入了这样一句:<classpathentry kind="src" path="/ymWeb"/>
这样,在.classpath文件中同时有两个src,另一个是<classpathentry kind="src" path="src"/>
我想这大概就是使Eclipse自动编译失效的原因。因为自从使用了本次Ctrl+1功能后,java文件就不能自动编译了!
解决方法:
OK,经过多次尝试,最后找到了解决办法:
如果在WEB工程中要使用EJB工程中定义的类,必须把EJB工程的output目录加入到WEB工程的build path,
所以在WEB工程的.classpath中加入这样一句
<classpathentry kind="lib" path="/ymEJB/classes"/>
反过来也一样,在EJB工程的.classpath中加入这样一句
<classpathentry kind="lib" path="/ymWeb/web/WEB-INF/classes"/>
即互相把对方的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选项卡->Add Class Folder来完成上面的操作
2.
加入jar到lib目录(随同应用一起发布)
lib右键->import->File system->选择要导入的jar
加入jar到build path(不会发布)
project->properties->Java Build Path->Libraries选项卡->Add External JARs
3.避免频繁启动jboss技巧。。。
4.在JAR包中无法调用WAR包中的class文件。所以要把WAR中公共的class文件打成一个JAR包
5.如何将新建的一个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目录,此时在war中可以调用,但在其它的jar包中无法调用,howto?
project->properties->Java Build Path->Libraries选项卡->Add JARs,选择ymWeb/web/WEB-INF/eXtremeComponents.jar
还是不可行,jboss还是找不到它,郁闷,只好将这个jar包放到default/lib目录下。reboot jboss
又提示找不到commons-StringUtils,,,,这些包全部都存在于ymWeb/web/WEB-INF/lib下,为什么会找不到?
7.<html:form>和<form>的一个小区别前者action="/userAction.do就可以了"后者要写成action="/ym/userAction.do"
8.以前碰到过的问题,不要在form中用disabled="disabled"应该使用readonly="readonly",只有后者的数据才会自动组装到ActionForm
9.解决乱码问题,对于乱码,一向是加过滤器,这次却不行了。郁闷,最后查明原因。EJB3自动建表使用了latin1 编码。将表的默认编码改为utf-8,并且去掉表中每一字段的编码。
最后还需要在mysql-ds.xml中设置jdbc:mysql://localhost:3306/message?useUnicode=true&characterEncoding=UTF-8,修改mysql-ds.xml后需要重新发布工程。
10以Packaged Archive的方式发布EAR包,修改文件后不用重启jboss可进行热布署
11.ec自带分页,能帮你计算出rowStart和rowEnd。
在本示例中,我用的是EJB3中的
Query.setFirstResult(limit.getRowStart()).setMaxResults(limit.getCurrentRowsDisplayed())
这样ec中的分页就与具体数据库无关了。。。。。