2015-04-30 34 views
0

我是新来的Java。在部署Web应用程序时遇到一些问题。WAR网页应用重新部署依赖关系

我有一个EJB项目,我在Glassfish(4.1)上部署。 我还有第二个部署到同一服务器的JSF WEB应用程序。 虽然我正在考虑将它部署到一个单独的服务器,因此它会创建它自己的InitialContext等来访问EJB。

Web应用程序依赖于EJB项目。依赖关系在web应用程序的pom中声明。 部署Web应用程序时,由于某种原因,它还尝试从其他项目部署EJB。 由于EJB已经在此服务器上单独部署,因此失败,出现错误,如javax.naming.NameAlreadyBoundException

如何解决这个问题,这样就不会尝试部署来自WEB应用程序的EJB依赖关系?

更新:该解决方案需要重构,因此EJB不会被依赖。

  Original   

    Project A     WEB app 
________________   ____________ 
| + EJBs   |<------| WEB stuff | 
| + Domain cl. |  ------------ 
| + Remote intf. | 
---------------- 

=========================================== 
      Refactored 

    _______  ____________ 
| EJBs |----->| Domain cl. | 
    -------  ------------ 
    |    ^
    |     | 
    |     | 
    v     | WEB app 
    ______________  ____________ 
| Remote intf. | <---| Web stuff | 
    --------------  ------------ 

回答

2

你可以给依赖provided一个scope

<dependency> 
    <groupId>group.id</groupId> 
    <artifactId>artifact.some.id</artifactId> 
    <version>1.0</version> 
    <type>ear</type> 
    <scope>provided</scope> 
</dependency> 

这意味着,在运行时,相关性将被由容器提供。

看到Maven的文档:

这很像编译,而是指你所期望的JDK或容器,以提供在运行时的依赖。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖性设置为范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径中可用,且不是传递性的。

+0

这实际上让我部署到同一台服务器。谢谢。 现在,当我尝试部署到另一台服务器时,我从WEB应用程序中得到'java.lang.NoClassDefFoundError'。 我可以将EJB依赖项声明回到'compile'范围,但是这些EJB也会被部署,并且在其他服务器上不需要它们。 有没有办法阻止EJB依赖性部署,但包括类? EJB总是远程检索。 – Varis

+0

听起来对我来说,您需要为部署到同一服务器时设置不同的Maven配置文件,而在部署到单独的服务器时需要另一个配置文件。然后,您将相关配置文件 – KernelKoder

+0

的相关性设置为所需的范围,我认为我发现了该问题。 EJB项目在一个项目中具有EJB,域类和远程接口。我把它分解了。 Web应用程序仅依赖于远程接口和域类。用ascii uml更新了问题。 – Varis