我一直在研究这个问题一整天,但没有任何有效的解决方案徒劳无功。
我有一个用 ejb 和一些 jar 文件(包括 hibernate 和其他依赖 jar 文件)打包的 ear 文件。ejb 是无状态的,可以作为 Web 服务启用。
ear文件已经使用maven打包,结构如下
ear->projectrelatedejb.jar
->休眠.jar
->其他依赖。罐
->META-INF/application.xml
->META-INF/manifest.mf
application.xml和manifest文件是maven在我做打包的时候自动生成的。
当我在 glassfish 上部署这个 ear 文件时,它会使用可使用 Web 服务访问的 ejb 方法进行部署。但是,当访问应用程序(使用soapui)时,使用hibernate 执行某些数据库功能的ejb 方法会在运行时为hibernate api 抛出java.lang.NoClassDefFoundError。
从错误中可以明显看出,hibernate jar 在运行时不在类路径中,但由于 jar 在耳内,Glassfish 应该将其添加到应用程序类路径中。
我尝试了各种选项,例如在打包过程中将类路径条目添加到 manifest.mf(通过使用带有 maven-ear-plugin 的元素 addClasspath),但没有任何好处。此外,对于 Glassfish,我们无法将依赖 jar 添加为模块到 application.xml,除非 jar 是应用程序客户端 jar(如果 application.xml 将依赖 jar 声明为模块,Glassfish 不会部署 ear 文件)。
我还尝试将罐子放在耳朵内的 lib 目录中(这实际上不是必需的),并且清单 Class-Path 标头引用 lib 目录中的罐子,这也没有解决问题。
我可以做的快速而肮脏的修复是把休眠和其他依赖的 jar 放在 Glassfish 的 lib 目录中。但是,这是一个不好的做法,我有点不愿意这样做。
如果有人能为我提供这个问题的有效解决方案,我将不胜感激。我已经通过网络寻找这个问题,但找不到任何解决方案。
想知道它是玻璃鱼的虫子,还是玻璃鱼需要一些特别的东西来引用耳朵里的罐子。
提前致谢。