今天我把我本地的Glassfish服务器升级到3.1.1,为我公司的服务器升级到相同的版本做准备。我正试图将我的web服务项目转换为与新服务器配合良好,并且遇到了一个障碍。
在我ear的pom文件中,我之前将webapp和ejb列为依赖项。在web应用程序的pom中,我也将ejb列为依赖项。当尝试将此配置部署到Glassfish 3.1.1时,我收到了这个错误:
部署时发生错误:部署应用程序时出现异常[ear]:无法解析引用Local ejb-ref name=name,Local 3。x interface =interface,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session,因为在具有interface interface的应用程序中有2个ejb。一些可能的原因:1;EJB bean类被打包在ear库库中(或通过任何其他库机制使库对所有组件模块可见),这使得所有组件模块间接地包含该bean类。2. EJB bean类被打包在一个组件模块中,该模块直接或间接地通过Manifest、WEB-INF/lib引用EJB。EJB bean类应该只打包在声明EJB模块中,而不是打包在引用模块中。引用模块应该只包括EJB接口。请参阅server.log到....msg.seeServerLog
本质上,我相信它是在说,因为我在两个不同的区域将EJB列为依赖项,Glassfish 3.1.1不知道该查看哪个依赖项。这在2.1.1中不是问题。因此,我去掉了对耳朵的依赖,因为它仍然是耳朵有效功能的一部分。
但是,现在ear生成application.xml文件时,它从文件中省略了所有ejb信息。我现在可以很好地部署应用程序,但是当我尝试运行任何东西时,我会得到关于ejb的NameNotFoundExceptions。
我尝试用标记手动将ejb模块添加到ear pom,但是当我尝试构建项目时,我得到错误消息:
Artifact[ejb]不是项目的依赖项。
尽管事实上,当我查看当前的有效pom时,我可以看到ejb被列为依赖项。
我怎样才能正确地生成application.xml文件,同时仍然符合Glassfish 3.1.1的更严格的规则集?
如果你需要更多的信息,请告诉我,谢谢你的帮助!
答案很简单,我有点自责。在webapp的pom文件中,我只需要将作用域行添加到ejb依赖项中:
<dependency>
<groupId>com.groupId</groupId>
<artifactId>webservice-service-ejbs</artifactId>
<version>${project.version}</version>
<type>ejb</type>
<scope>provided</scope>
</dependency>
有了这个,我可以保持ejb依赖在ear pom中,application.xml正确生成,并且glassfish 3.1.1不会混淆认为有多个具有相同名称的ejb类。
编辑:下面是ejb依赖项在ear pom
中的样子<dependency>
<groupId>com.groupId</groupId>
<artifactId>webservice-service-ejbs</artifactId>
<type>ejb</type>
</dependency>
感谢那些帮助过我的人。