我一直在研究这个问题一整天但没有任何有效的解决方案是徒劳的。
我有一个包含ejb和一些jar文件的ear文件(包括hibernate和其他相关的jar文件).ejb是无状态的并且作为Web服务启用。
ear文件已使用maven打包并具有以下结构
EAR-> projectrelatedejb.jar
- > hibernate.jar
- > otherdependent。罐
- > META-INF / application.xml中
- > META-INF / MANIFEST.MF
当我执行包时,maven会自动生成application.xml和manifest文件。
当我在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将依赖jars声明为模块,Glassfish将不会部署ear文件。)
我还尝试将jar放在ear目录中的lib目录中(实际上并不需要),并且使用清单Class-Path标头引用lib目录中的jar,这也解决了问题。
我可以做的快速而肮脏的修复工作是将hibernate和其他依赖的jar放在Glassfish的lib目录中。但是,这是一个不好的做法 我有点不愿意这样做。
如果有人能为我提供这个问题的解决方案,我真的很感激。我已经通过网络寻找这个问题 但是找不到任何解决方案。
想知道它是玻璃鱼的缺陷还是玻璃鱼需要特别的东西来引用耳朵里的罐子。
提前致谢。
答案 0 :(得分:2)
我发现了一个类似的问题,在这里讨论:http://www.tricoder.net/blog/?p=59。
简单地说,尝试将库放在EAR / lib目录中,根据JEE5规范,glassfish会自动将它们添加到类路径中。
答案 1 :(得分:1)
我使用Server Library
选项来部署应用程序JAR,它对我有用。
右键点击EAR-> Properties -> Libraries-> Add Library -> Create ->
提供名称并将Library Type
中的类型更改为Server Libraries
,然后添加应部署并确认的JAR。
我使用NetBeans 7.0.1和GlassFish server 3.1
答案 2 :(得分:0)
当你说你向manifest.mf添加了类路径条目时,你引用了哪个manifest.mf?耳根/ META-INF / manifest.mf中的那个?尝试使用Class-Path条目将META-INF / MANIFEST.MF添加到您的ejb模块中!