WAR Web 应用重新部署依赖项

WAR web app redeploying dependencies

我是 Java 的新手。在部署 Web 应用程序时遇到一些问题。

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

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

如何解决这个问题,使来自 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  |
  --------------       ------------

你可以给依赖一个 scope of provided:

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

这意味着在运行时,依赖将由容器提供。

查看 Maven 文档:

This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.