搞掂 EJB3 JPA Hibernate 在Weblogic11g的部署
今天,终于解决了EJB3+CMP+JPA1.0+Hibernate3在Weblogic10.3.3下的部署。核心方案是利用Weblogic针对一个企业应用包可以单独加载类的机制,从而不受weblogic系统本身的antlr2.7.3版本与Hibernate3使用的Antlr2.7.6冲突的限制了。
1.打成一个EAR包。
EAR
--META-INF
--application.xml
--weblogic-application.xml
--lib
--hibernateXXXX.jar(多个文件)
--antlr2.7.6.jar
--xxx(ejb).jar
--xxx(ejb).jar
2.application.xml描述有哪些ejb和web包。
如:
<?xmlversion="1.0"encoding="UTF-8"?>
<applicationxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/application_5.xsd"id="Application_ID"version="5">
<display-name>eb_b2b_sqs_ear</display-name>
<module>
<ejb>eb_platform_ejb.jar</ejb>
</module>
<module>
<ejb>eb_cache_ejb.jar</ejb>
</module>
<module>
<ejb>eb_b2b_ejb.jar</ejb>
</module>
<module>
<ejb>eb_b2c_ejb.jar</ejb>
</module>
</application>
3.weblogic-application.xml描述内容为:
<?xmlversion="1.0"encoding="UTF-8"?>
<wls:weblogic-applicationxmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/javaee_5.xsdhttp://xmlns.oracle.com/weblogic/weblogic-applicationhttp://xmlns.oracle.com/weblogic/weblogic-application/1.2/weblogic-application.xsd">
<!--weblogic-version:10.3.4-->
<wls:application-param>
<wls:param-name>webapp.encoding.default</wls:param-name>
<wls:param-value>UTF-8</wls:param-value>
</wls:application-param>
<wls:prefer-application-packages>
<wls:package-name>antlr.*</wls:package-name>
</wls:prefer-application-packages>
</wls:weblogic-application>
---------------OK。
网上提到的其他解决方案:
1.把antlr2.7.6.jar放到weblogic启动脚本的classpath最前面---这个方案会破坏weblogic原有的功能,部署会经常提示java.lang.NoClassDefFoundError:antlr/TokenStreamException。虽然不影响业务应用本身,但是终究不是好办法。
2.在WEB-INF/weblogic.xml里添加:
<?xmlversion="1.0"encoding="UTF-8"?>
<wls:weblogic-web-appxmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsdhttp://xmlns.oracle.com/weblogic/weblogic-web-apphttp://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
<wls:weblogic-version>10.3.4</wls:weblogic-version>
<wls:context-root>eb_web</wls:context-root>
<wls:container-descriptor>
<wls:prefer-web-inf-classes>true</wls:prefer-web-inf-classes>
</wls:container-descriptor>
</wls:weblogic-web-app>
---这个方案是针对web应用的,如果hibernate是在web端使用的,可以采用。如果hibernate在ejb端使用,就采用本文开头的做法。
在此,感谢无数网友的文章,这个方法不是我发明的。
在此,鄙视oracle技术服务人员,我一个月前咨询过(我有客户支持识别号),他们说:hibernate没有经过他们的验证,要改,只能改hibernate,推荐使用eclipseLink。
我尝试改过EclipseLink,但是EclipseLink和Hibernate对HQL写法,还是有区别的(如:selectcount(*)和selectcount(1),leftjoin别名等),程序已经做完了,改动太多,就放弃了。
庆祝一下