以编程方式获取 Tomcat 的 "appBase" 目录?

Getting Tomcat's "appBase" directory programmatically?

默认情况下,appbase 配置为指向 TomEE 的 webapps 文件夹:

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

我想以编程方式找到 "appBase" 的位置,因为它指向我们的生产服务器和我们的开发箱上的不同位置(并且因为这样会更干净)。

我研究了几个选项,似乎对其他人有用的选项是调用 ServletContext().getRealPath("/")。对我来说,这会将我带到一个临时文件夹 $CATALINA_HOME/temp/[#-AppName],而默认情况下我正在寻找 $CATALINA_HOME/webapps.

我根据其他人在 this question.

上写的内容找到了答案

从 Tomcat 的主机 class 您可以找到应用程序库:

    MBeanServer mBeanServer = MBeanServerFactory.findMBeanServer(null).get(0);
    ObjectName name = new ObjectName("Catalina", "type", "Server");
    Server server = (Server) mBeanServer.getAttribute(name, "managedResource");
    Service service = server.findService("Catalina");
    Engine engine = (Engine) service.getContainer();
    Host host = (Host) engine.findChild(engine.getDefaultHost());

    host.getAppBase(); //Got it.

使用 host.getAppBase() 的问题是您需要自己解决(可以是绝对的或相对的)所以不要忘记使用 https://github.com/apache/tomee/blob/4b9d8c9d221948547d49427077fcf68709a186bd/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java#L192

提示:如果您不想依赖 JMX(通常是 new ObjectName("Catalina", "type", "Server");取决于您在 server.xml 和 Catalina 可以更改,因此您必须使用通配符来依赖该实现)您可以使用 tomee TomcatHelper.getServer() 获取服务器然后浏览 children 你得到主机:https://github.com/apache/tomee/blob/4b9d8c9d221948547d49427077fcf68709a186bd/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java#L285