我希望并行运行多个基于Java Servlet的Web应用程序的多个版本(如myapp2.1,myapp2.2 ...)。
一种可能性是将每个版本部署到一个单独的servlet上下文(它应该有自己的类加载器?!)。但我认为它很难管理,也不会灵活,因为应用程序是一个非常大的块。如果应用程序应包含两个不同版本的服务,该怎么办?也许那不是一个好主意......
环境将是GlassFish> = 3.0。
什么是并行运行多个版本的servlet应用程序的更好方法? OSGI能帮忙吗?
答案 0 :(得分:4)
每个Web应用程序都将使用自己的ClassLoader加载(至少我知道的任何容器;我无法想象容器为什么不这样做)。所以,它应该工作。你班级的不同版本不会相互干扰。
确保您不在容器自己的ClassLoader中包含任何类 - 例如将.jar放在Tomcat的目录中的lib /中(不确定Glassfish的等效项)。这将由所有Web应用程序共享,并将覆盖Web应用程序中的任何内容。
答案 1 :(得分:2)
一种可能性是将每个版本部署到一个单独的servlet上下文(它应该有自己的类加载器?!)。
J2EE应用程序使用单独的ClassLoaders层次结构,并且彼此隔离。引用Classloaders and J2EE:
J2EE类加载器层次结构
J2EE指定了一个层次结构 需要类加载器才能实现 应用程序之间隔离,但是 将它留给供应商来定义 确切的结构。但要遵守 大多数都是J2EE规范 供应商每个都有类加载器 J2EE应用程序组件 取决于它的位置。进一步, 这些类加载器具有层次结构 他们之间,即他们有一个 亲子关系。图21.5 显示了一个示例层次结构 类加载器。请注意每个 应用程序服务器的类加载器 等级可能略有不同。 有时应用服务器供应商 倾向于治疗其中的两种或更多种 类加载器为一体。例如,a 某些应用服务器可能会对待 应用程序类加载器和EJB classloader是一样的。但是 层次结构背后的一般概念 保持不变。
图21.5 J2EE应用程序服务器中的示例类加载器层次结构。
所以,是的,每个webapp都有自己的ClassLoader
(感谢上帝)。
但我认为这将很难管理,也不会灵活。
为什么难以管理?为什么不灵活?你要和多少个实例并行运行?实际上,你想解决什么问题?如果你描述真正的问题,你可能会得到更好的答案。所以,你能详细说一下吗?
答案 2 :(得分:0)
除非您明确地将其配置为如此,否则所有servlet都是多线程的,可以一次调用多次。
那么,您是否希望具有相同代码但具有不同名称的多个Web应用程序或具有不同配置的同一Web应用程序中的多个servlet?请用方案编辑您的问题。
您只需将您部署的war文件命名为application20091230,application20091231,application20100101,然后让Glassfish将其分配给相应的URL。如果日期不够精细,那么可以是datetime或buildnumber。
这就是我们在单个内部测试服务器中使用多个版本所做的工作。