搞掂 EJB3 JPA Hibernate 在Weblogic11g的部署

zezeperfect 2011-02-06

今天,终于解决了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别名等),程序已经做完了,改动太多,就放弃了。

庆祝一下

相关推荐