用了日子不短的jboss,感觉越来越顺手,tomcat基本上都不用了,哎,最近一个项目非要用tomcat7。只能再复习一下了。虽说以前老用,感觉比较容易,其实还有点问题的。
因为习惯了依赖入住这些东西,当然也希望在tomcat下使用。spring因为数据源死锁的问题,我是不敢用了。我能用替代方案就是guice和EJB/CDI两种,guice稍微生疏点,而且在jboss中(或者说javaee中)ejb,cdi绝对是标准的主力,所以倾向于ejb/cdi这条路,前一段看到tomee/openejb发展的不错,就尝试配置了一下。
1.tomcat7必须是7.0.54或者7.0.55,低版本的不行。
2.开始下载的是tomee-webapp-1.7.0.war,加上tomcat7.0.55,看起来大概能用了
3.把tomee-webapp-1.7.0.war改名为tomee.war(必须的),然后扔到webapps下。
4.启动tomcat7
要说以上配置就完成了,运行也比较正常,但是,用到开发环境就有点问题了。我的一个应用,在ecipse(非myeclipse)中,死活就是无法Inject,搞了半天,只能下载标准的apache-tomee-1.7.0-webprofile.zip来做开发环境。服务器吗,人家客户的东西,不能乱动,就用tomcat+openejb来运行,效果和tomee一样的。
废话很多了,就说说开发环境的配置吧。
1.下载并解压apache-tomee-1.7.0-webprofile.zip,我的文件夹名是"tomee1.7"这是集成好的环境,至于jdk之类的就不说了。双击tomee1.7/bin/startup.bat,启动成功,第一步完成
2.在eclipse,我用的是jbosstools,可以添加tomcat服务器。把servers视图调出来,新增一个tomcat7的server,目录指向刚才解压的那个tomee1.7目录
3.配置好tomcat,在package explorer中会出现一个Servers的工程,里面有Tomee1.7-config这个文件夹,前缀Tomee1.7是根据你的tomee目录名起的。右键点“Tomee1.7-config”->import->General->File System,点“Next”,从真正的tomee1.7服务器的conf文件夹导入所有的配置文件。这一步必须的,否则Tomee1.7-config只会有基本的tomcat配置文件,不会有tomee.xml等文件。开发环境基本完成
4.web应用:注意以下几点:1)web-inf/下必须有CDI的配置文件beans.xml; 2)如果使用EJB的BMP,部署后的classes/下必须有persistence.xml(按说tmd应该在meta-inf的,不知道咋回事,web工程这个样)3)数据源配置在Servers工程的Tomee1.7-config/tomee.xml中。(服务器的tomee就在conf中)
总体上其实不难,我遇到的主要问题总结:
1.开发环境中,直接使用tomcat7,然后使用的tomee-webapp-1.7.0.war来组合,在servers工程中修改了server.xml,增加了tomee的Context配置,但是问题是web应用启动顺序不受控制。一旦tomee在你应用后面启动,那你的CDI将完全失效。这问题只是在开发环境存在,在真正的tomcat上,会先启动tomee这个应用,原因我想大该jbosstools中的tomcat,没有达到7.0.44这个版本导致的,如果用tomcat8来配置就不清楚了。可能的解决办法还包括在workspace中那个临时部署目录中复制一个tomee,不过没有验证过。
2.配置数据源,在Servers/Tomee1.7-config/
<Resource id = "creditDS" type="DataSource">
JdbcDriver com.mysql.jdbc.Driver
JdbcUrl jdbc:mysql://localhost:3306/credit?autoReconnect=true&useUnicode=true&characterEncoding=utf-8
UserName root
Password root
JtaManaged true
</Resource>
本来看这个格式,感觉不会用&来替换&了,但是其实还是要用的。另外其他链接参数也最好配置,比如初始大小,空闲时间,最小/最大连接数。不配置长时间运行会出些问题。
3.EJB实体Bean默认的实现是OpenJPA,不是hibernate。在jboss直接就是hibernate,所以tomee环境中需要在persistence.xml需要配置provider,但是如果加入如下配置,就自动认定是hibernate实现了:
<properties>
<!-- Properties for Hibernate -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
</properties>