【问题标题】:deploying WAR and EJB-jar files separately分别部署 WAR 和 EJB-jar 文件
【发布时间】:2014-10-26 11:46:13
【问题描述】:

我有一个要部署在GlassFish 上的应用程序。它有一个 EJB 层,带有 (JPA) 实体和 EJB 以访问和写入数据库,它有 3 个(独立的)Web 应用程序。一切都是用Maven构建的。

ServerApplication 
  |
  +-ServerApplication-ear
  +-ServerApplication-ejb
  |
  +-GrumpyCat (war)
  +-HummingBird (war)
  +-Koala (war)

所有三个war 项目都依赖于ejb 项目。在编译/构建ear时,它会将war文件复制到ear项目,然后我可以将ear文件部署在GlassFish上。

这很好用,所有 4 个模块(ejb 和 3 war)都可以顺利部署,我可以访问 3 个war 项目,例如:

myServer.com/GrumpyCat
myServer.com/HummingBird
myServer.com/Koala

我的问题是,我无法单独部署一个 war 项目。例如,当我在 koala 项目中更改某些内容时,我希望能够只构建 koala.war 并将其部署在服务器上,而无需上传和部署完整的 ear 文件。

但在部署时,GlassFish 会告诉我:

  • Koala上已经部署了一个项目(没错,是和耳朵一起部署的)
  • 或者(当我更改构建版本时)它不“知道” ejb,我得到了一些 ClassNotFound 异常。

有没有办法一个一个地部署应用程序的模块?

【问题讨论】:

    标签: java maven jakarta-ee glassfish


    【解决方案1】:

    如果您真的想单独部署它们,您的第二种方法是可行的方法。但是,您会看到 ClassNotFound 异常,因为 WAR 是单独的项目,因此无法访问 EAR 的类路径。

    要实现这一点,您必须将应用程序的公共 API 添加到 WAR 的类路径中。公共 API 至少包含您希望从 WAR 访问的 EJB 的 EJBS 远程接口以及 API 中使用的任何 DTO。

    最简单的方法是创建一个单独的包(例如com.example.api)并让构建工具(例如 ant 或 Maven)将该 api 包与您的 EJB 和 WAR 捆绑在一起,或者您创建一个 myapp-api.jar 并包含它在各自的类路径中。

    然后您可以从 EAR 中移除 WAR,并将它们部署为单独的项目。

    【讨论】:

    • 谢谢!听起来很有希望。不过,我将不得不阅读远程界面,我希望我不会造成自己的瓶颈:)
    • 如果将它们部署到同一台服务器上,它仍然是本地的(在同一个 JVM 中)并且应该没有瓶颈,即使它被称为“远程”。
    猜你喜欢
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2015-04-18
    • 2012-04-26
    相关资源
    最近更新 更多