【问题标题】:Dynamically loading jars from remote location从远程位置动态加载罐子
【发布时间】:2014-12-31 12:36:06
【问题描述】:

以下场景是否有框架或解决方案。

我有一个 webapp 在 Tomcat 服务器上运行。启动我的应用程序时,我想下载一些完全不同的 jars。像外部的关系服务器或其他东西。在那些 jars 中是我所有需要注入 spring 的业务逻辑。

为什么我想要这样的东西?我的应用程序安装在许多不同的位置。为了在所有安装中轻松获得最新版本的代码,我只想更新 1 个位置,并且所有应用程序在重新启动后都会更新。

【问题讨论】:

标签: java tomcat nexus


【解决方案1】:

您的应用程序需要使用自定义 ClassLoader 来执行此操作。

好消息是您不必自己编写:您可以使用 Java 的内置 java.net.URLClassLoader。坏消息是您必须将它连接到 Tomcat,这可能需要一些代码。

这是一个未经测试的建议:

  1. 写一个扩展Tomcat的WebappClassLoaderClassLoader
  2. 添加一个URLClassLoader 成员并在您的构造函数中初始化它(或LifecycleListener 事件之一,如start()
  3. 覆盖所有方法以调用具有相同签名的超类的方法,并在您正在使用的 URLClassLoader 中调用相同的方法。您咨询super.whateverurlClassLoader.whatever 的顺序由您决定:阅读 servlet 规范以确定您想如何做事
  4. 通过在 Web 应用程序的 META-INF/context.xml 文件中定义 <Loader> 来安装您的自定义 ClassLoader

如果您在上述任何方面需要帮助,请前往Tomcat users' mailing list

编辑 2014-11-04

请注意,我认为使用URLClassLoader 来做这种事情是脆弱的、容易出错的,而且可能是个坏主意。相反,请修复您的部署过程,以便更轻松地跨集群更新您的 Web 应用程序。您可以使用 Tomcat 的“farm web deployer”来执行此类任务,或者使用其他一些解决方案。但是通过网络加载类可能会使您的生活复杂化,并在某些情况下导致一些奇怪的不可重现的行为。

【讨论】:

    【解决方案2】:

    通常,这是在部署期间使用rsync 脚本或其他类似的脚本将部署工件分发到集群中完成的。

    您或许可以将 Tomcat 提供的 WebappClassLoader 配置为从远程位置加载。

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2023-03-28
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-11
      相关资源
      最近更新 更多