【问题标题】:Is there any native mechanism whereby we can override classes in an existing deployed Struts2 app?是否有任何本地机制可以让我们覆盖现有部署的 Struts2 应用程序中的类?
【发布时间】:2012-09-24 14:22:50
【问题描述】:

具体来说,如果我们在应用服务器中部署了一个原始 .war 文件,是否可以部署一个在原始文件中提供不同类实现的 .war 文件,而无需修改基础代码来支持这一点?

编辑。我错误地表述了这个问题,我认为它实际上更简单。我们希望在同一基本路径中公开来自两个不同 WAR 的操作,而不是为每个 WAR 使用不同的路径。可以在容器配置级别完成吗?还是建议使用 URL 重写之类的方法?

【问题讨论】:

  • 战争是一个完整的 Web 应用程序,它不是在运行的应用程序之上的一组增量类。
  • 你能重新部署 WAR 吗?您唯一的要求是不修改原始“基本代码”吗?
  • 我相信是的。 (我无权访问该项目,我只是在调查实际开发团队可以做到的可能方式)

标签: java jakarta-ee struts2


【解决方案1】:

不容易。通常,已部署的 WAR 会成为 Java EE 服务器中的离散 Web 应用程序,并拥有自己的类加载器。您的第二次部署将获得另一个类加载器,尽管它们肯定会共享一些祖先,但无法从另一个 WAR 重新实现事物 - 您的第二次部署将无法“看到”它,因为类加载器被链接在一起。

可以使用Java agent 重写正在运行的类,尽管这很重要。您可以转换(重写传入的)类,并且应该能够重写实时(实例化)类,尽管存在的问题是堆上可能存在使用旧代码和新代码的对象。

类重写是 Eclipse 的 Hot Code Replace 的工作方式,也是 JRebel's 快速重新部署解决方案的工作方式。

如果你真的想追求这个,你也许可以使用AspectJ 之类的AOP 系统 - 但听起来你正在尝试解决构建或部署问题,而不是 AOP 的问题更合适的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多