0

我一直在研究这个问题一整天,但没有任何有效的解决方案徒劳无功。

我有一个用 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 目录中。但是,这是一个不好的做法,我有点不愿意这样做。

如果有人能为我提供这个问题的有效解决方案,我将不胜感激。我已经通过网络寻找这个问题,但找不到任何解决方案。

想知道它是玻璃鱼的虫子,还是玻璃鱼需要一些特别的东西来引用耳朵里的罐子。

提前致谢。

4

3 回答 3

2

我发现了一个在这里讨论的类似问题:http ://www.tricoder.net/blog/?p=59 。

简单地说,尝试将库放在 EAR/lib 目录中,根据 JEE5 规范,glassfish 会自动将它们添加到类路径中。

于 2011-11-08T04:57:15.473 回答
1

我使用Server Library选项来部署应用程序 JAR,它对我有用。右键单击您的EAR-> Properties -> Libraries-> Add Library -> Create ->名字并更改类型,Library Type然后Server Libraries添加应部署的 JAR 并确认。

我使用 NetBeans 7.0.1 和 GlassFish server 3.1

于 2011-11-20T14:34:31.770 回答
0

当您说您将类路径条目添加到 manifest.mf 时,您指的是哪个 manifest.mf?ear-root/META-INF/manifest.mf 中的那个?尝试使用 Class-Path 条目将 META-INF/MANIFEST.MF 添加到您的 ejb 模块!

于 2011-03-11T20:04:01.590 回答