我目前有一个WAR项目和一个EJB项目,以及一个将它们捆绑在一起的EAR项目。
实际上它正是项目 Maven> Netbeans样本中的企业应用程序。
然后我在WAR项目中创建一个Web服务,并希望它在我的EAR项目中调用会话bean。很简单。
我的代码看起来像这样:
@WebService(serviceName = "NewWebService")
public class NewWebService {
@EJB
NewSessionBean bean;
起初我的编译器抱怨它找不到这个公平的NewSessionBean类,因为它们在不同的项目中。
通过Netbeans的提示'我看到Netbeans建议我将EJB项目添加为依赖项,所以我这样做。
My Maven XML现在在WAR POM中有这个:
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mavenEJBExample-ejb</artifactId>
<version>1.0-SNAPSHOT</version>
<type>jar</type>
</dependency>
大!
但现在当我右键单击EAR文件并单击Run(又称Deploy)时,它表示Web Service无法找到EJB引用:(
为什么部署EAR不尊重WAR对EJB项目的依赖性?即使我在Maven XML中具有依赖性?
Schwerwiegend: Ausnahme beim Deployment der Anwendung [mavenEJBExample-ear]
Schwerwiegend: Exception during lifecycle processing
java.lang.IllegalArgumentException: Referenz [Remote ejb-ref name=com.mycompany.NewWebService/bean,Remote 3.x interface =com.mycompany.NewSessionBean,ejb-link=null,lookup=,mappedName=,jndi-name=,refType=Session] kann nicht aufgelöst werden, da [2]-EJBs in der Anwendung mit Schnittstelle com.mycompany.NewSessionBean vorhanden sind. \nEinige der möglichen Gründe: \n1. Die EJB-Bean-Klasse wurde in einer EAR-Library verpackt (oder durch ein anderes Library-Verfahren, das die Library für alle Komponentenmodule sichtbar macht). Dadurch schließen alle Komponentenmodule diese Bean-Klasse indirekt ein. \n2. Die EJB-Bean-Klasse wurde in einem Komponentenmodul verpackt, das das EJB entweder direkt oder indirekt über Manifest, WEB-INF/lib referenziert. \nDie EJB-Bean-Klasse darf nur im deklarierenden EJB-Modul und nicht in den referenzierenden Modulen verpackt werden. Die referenzierenden Module dürfen nur EJB-Schnittstellen einschließen.
at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:356)
at com.sun.enterprise.deployment.util.DefaultDOLVisitor.accept(DefaultDOLVisitor.java:78)
at com.sun.enterprise.deployment.util.ComponentValidator.accept(ComponentValidator.java:123)
at com.sun.enterprise.deployment.util.ApplicationValidator.accept(ApplicationValidator.java:147)
答案 0 :(得分:2)
至于你要使用EJB代理,我建议改变依赖的类型。另外因为你正在部署一个.ear存档,我希望你已经有一个添加了EBJ的jar。您可以通过浏览.ear来查看它。如果您发现带有EJB的jar已经添加到.ear存档中,您可能希望将范围设置为提供,因此不会添加两次。
<dependency>
<groupId>com.mycompany</groupId>
<artifactId>mavenEJBExample-ejb</artifactId>
<type>ejb-client</type>
<scope>provided</scope>
<version>1.0-SNAPSHOT</version>
</dependency>