从远程位置动态加载罐子

时间:2014-11-04 14:55:20

标签: java tomcat nexus

是否存在以下方案的框架或解决方案。

我在Tomcat服务器上运行了一个webapp。在启动我的应用程序时,我想下载一些位于完全不同的罐子。像外部nexus服务器或东西。在那些罐子里,我的所有业务逻辑都需要注入弹簧。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  1. 编写一个扩展Tomcat ClassLoader
  2. WebappClassLoader
  3. 添加URLClassLoader成员并在您的构造函数中初始化(或LifecycleListener之类的start()事件之一
  4. 覆盖所有方法以调用相同签名的超类方法,并在您正在使用的URLClassLoader中调用相同的方法。您咨询super.whateverurlClassLoader.whatever的顺序取决于您:阅读servlet规范以确定您希望如何执行操作
  5. 通过在您的网络应用程序的ClassLoader文件中定义<Loader>来安装自定义META-INF/context.xml
  6. 如果您需要任何上述帮助,请前往Tomcat users' mailing list

    编辑2014-11-04

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

答案 1 :(得分:0)

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

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