如何在Maven中的WAR项目中指定EJB引用?

时间:2013-11-20 15:31:00

标签: java maven java-ee netbeans ejb

我目前有一个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)

1 个答案:

答案 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>