【问题标题】:Location of JDBC jar for hibernate on JBOSSJBOSS 上用于休眠的 JDBC jar 的位置
【发布时间】:2011-05-08 21:33:29
【问题描述】:

我正在使用 jboss 5.1.0 GA 并且正在使用休眠从我的应用程序连接到 postgresql 数据库。我正在使用 jboss 中的默认休眠 jar。 在我的应用程序大战中,我只打包应用程序特定的 jar 和其他在 jboss 中找不到的 3rd 方 jar。

如果我将我的 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 jars 来自 jboss,我没有用我的应用程序打包它们。

更新:另一个问题。我们希望在哪些情况下使用默认的休眠 jar,在哪些可能的情况下我们希望将休眠 jar 与我们的应用程序一起打包?

谢谢,

【问题讨论】:

  • 似乎加载 Hibernate jar 的类加载器无法在应用程序的 WEB-INF/lib 中看到该 jar。
  • 我也是这么想的。但这正常吗?它是否需要显式更改配置才能按我想要的方式工作?

标签: hibernate postgresql jdbc jboss classloader


【解决方案1】:

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

据我所知,这是不可能的。简单来说,类加载器是按父子树排列的。当一个类加载器被要求加载一个特定的类时,它首先将请求委托给父类加载器,然后如果父类加载器找不到请求的类,则查看它自己的级别。

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

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

总而言之,将驱动程序保持在 webapp 级别的唯一方法是在 webapp 中捆绑 Hibernate jar 并禁用父委托,以便 webapp 中的 Hibernate JAR改用 JBoss 的那些。

我们希望在哪些场景中使用默认的休眠 jars (...)

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

资源

【讨论】:

  • 感谢您输入帕斯卡。这很有用!
  • @Pangea 如果你明白它的意思,使用它没有错。
猜你喜欢
  • 2013-05-23
  • 2011-03-24
  • 2017-04-30
  • 1970-01-01
  • 2010-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多