JBoss 5.1 GA 配置Web应用包括数据源在内的一系列问题

JBoss 5.x 的类路径检查非常严格,尤其是一些类库如Hibernate,xerces解析器在加载的时候,一旦有重复包存在,程序就会发生怪事,具体何种怪事则依情况而定,总之原则是你的程序一定跑不起来。

手头有个项目,构建原型的时候图方便,就暂时使用tomcat6做服务器,因为采用的是比较基本的ajax + servlet/jsp + javaBean 的架构,所以tomcat用起来还是相当顺手的。最近由于一些很无奈的原因,项目匆匆进入生产部署阶段,需要跟公司的产品集成并一齐部署在JBoss 5.1GA 上,麻烦开始接踵而至。

刚把JBoss注册进IDE(NetBeans6.5.1) 就立刻感到了一些不爽,首先是servlet-api和jasper库文件在JBoss的/common/lib 下面,NetBeans找不到(经过测试,即使是6.7的NB也不行),所以servlet的源文件开始时都无法编译,并且jsp在编辑的时候都不能即时编译,也就无法报错和代码提示,相当烦人。别无他法,只好手动从common/lib里把这几个缺席的哥们补上,当然,这些手动添加的库文件是JBoss里已经有了的,所以要在该新添库的右边把“package”的勾选去掉,负责项目加载的时候又将出现一个重复包引发的血案。

项目的DAO层使用Hibernate3.2实现,这里必须要注意的是,JBoss是自带Hibernate的绝大多数库文件的,所以IDE引入的Hibernate相关库绝对不能随着项目打包,做法同上,把“package”的勾选去掉即可。我曾被这个问题困扰,因为将Hibernate打进war包的结果就是JBoss将在程序运行的时候报出下面的错误信息:

org.jboss.resource.adapter.jdbc.WrapperDataSource cannot be cast to javax.sql.DataSource

这个错误信息很能迷惑人,因为它似乎跟你说数据库的驱动有问题,事实上在很多情况下这个错误就是源自驱动包重复,有一些人在部署项目的时候把数据库驱动也打包了,而JBoss服务器已经存在了一个同样的包。可是Hibernate的存在怎么也能出现这样的问题呢,请注意,产生以上错误信息的代码只是一段极为简单的纯JDBC代码:

InitialContext initialContext = new InitialContext();
DataSource ds = (DataSource) envContext.lookup("java:jdbc/MySqlDS");
Connection conn = ds.getConnection();
......

这段代码跟Hibernate毫无关系,居然是背后的罪魁祸首。要知道,同样的代码在JBoss4.23中部署绝无问题,JBoss5确实太严格了。

最后一个小问题,在配置数据源的时候,假如在mysql-ds.xml里定义的jndi是“jdbc/MySqlDS",那么默认情况下数据源的jndi会被注册成“java:jdbc/MySqlDS”,这在控制台里观察JBoss启动信息的时候可以观察到,但是如果你在配置时多写一行:

<local-tx-datasource>
......
<use-java-context>false</use-java-context>
......
</local-tx-datasource>

那么lookup的时候只需要"jdbc/MySqlDS"就行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值