Java 获取JVM(servlet容器)中加载的所有ServletContext

Java 获取JVM(servlet容器)中加载的所有ServletContext,java,tomcat,servlets,servlet-container,Java,Tomcat,Servlets,Servlet Container,给定一个servlet容器(JBoss、Tomcat、Jetty等),是否可以找到JVM或更具体地说servlet容器当前实例化的所有servlet上下文(或servlet配置)?如果是这样,怎么做?我不确定其他容器,但Tomcat允许您通过JMX访问大量信息。将jconsole、VisualVM或另一个JMX浏览器连接到Tomcat进程,并查看Catalina下的type=WebModule,您可以看到已加载上下文的列表。您可以在该子树中找到的每个JMX bean都有大量关于服务器状态的信息。

给定一个servlet容器(JBoss、Tomcat、Jetty等),是否可以找到JVM或更具体地说servlet容器当前实例化的所有servlet上下文(或servlet配置)?如果是这样,怎么做?

我不确定其他容器,但Tomcat允许您通过JMX访问大量信息。将jconsole、VisualVM或另一个JMX浏览器连接到Tomcat进程,并查看Catalina下的type=WebModule,您可以看到已加载上下文的列表。您可以在该子树中找到的每个JMX bean都有大量关于服务器状态的信息。

谢谢,但我知道这一点,我正在尝试寻找一种实现无关的方法,更不用说JMX控制台不能满足我所需的所有要求。如果有一种方法可以查找JVM当前加载的给定接口的所有实例,那就太好了。你不会找到一种与实现无关的方法,因为servlet规范没有定义类似的内容。如果你绝望了,您可以编写一些代码与JVM的评测接口交互(不确定当前的最新技术是什么,但t过去是JVMPI和friends),只需检查JVM中的每个类或对象。收集实现
ServletContext
的对象,就完成了。大部分。可能有一些对象的类实现了该接口,但这些对象是虚拟对象,或者以前终止的Web应用程序还没有GC,等等。您还必须定期扫描,因为事情随时都可能发生变化。实际上,我可能已经找到了一种使用名为org.reflections的反射库来实现这一点的方法。不幸的是,reflections库只给出了所使用的类的引用,而没有给出实际的类实例本身。