JBOSS上用于hibernate的JDBC jar的位置

时间:2010-11-12 05:43:56

标签: hibernate postgresql jdbc jboss classloader

我正在使用jboss 5.1.0 GA并使用hibernate从我的应用程序连接到postgresql DB。我正在使用jboss中发现的默认hibernate jar。 在我的应用程序战争中,我只包装应用程序特定的罐子和jboss中找不到的其他第三方罐子。

如果我将postgres jdbc jar放在server / xxxx / lib下,它就会被选中。

如果我将它放在我的应用程序war文件的web-inf / lib下,它就不会被选中,我得到了 -

java.sql.SQLException: No suitable driver
at java.sql.DriverManager.getConnection(DriverManager.java:545)
at java.sql.DriverManager.getConnection(DriverManager.java:140)
at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)

我的问题是如何让jboss从web-inf / lib下加载postgres驱动程序jar?

就像我说的那样,hibenate罐子来自于jboss而且我没有用我的应用程序包装它们。

更新:另一个问题。我们期望在哪些场景中使用默认的hibernate jar,在什么情况下我们想要将hibernate jar与我们的应用程序一起打包?

谢谢,

1 个答案:

答案 0 :(得分:3)

  

我的问题是如何让jboss从web-inf / lib下加载postgres驱动程序jar?

据我所知,这是不可能的。简而言之,类加载器被安排在父子树中。当要求类加载器加载特定类时,它首先将请求委托给父类加载器,然后如果父类加载器找不到所请求的类,则查看它自己的级别。

因此,虽然父类加载器(例如服务器类加载器)加载的类在子类加载器(例如webapp类加载器)中是可见的,但反之亦然。

换句话说,用于加载Hibernate类的类加载器无法从webapp中看到类,因此如果不将它放在同一级别(或更高级别的层次结构中),则无法加载驱动程序。

总而言之,将驱动程序保持在webapp级别的唯一方法是将Web协议中的Hibernate jar捆绑到禁用父委派,以便来自webapp的Hibernate JAR得到了来自JBoss的那些。

  

我们希望在哪些场景中使用默认的hibernate jar(...)

通常在将JPA与容器管理的实体管理器一起使用时。

资源