Tomcat 7 - 在运行时获取应用程序名称,无需通过 java-agent/aspectj 登录

Tomcat 7 - Get the application name during runtime without login via java-agent/aspectj

我正在尝试获取所有已部署应用程序的列表,特别是 映射到 tomcat root 的应用程序的名称。 我希望能够在运行时使用 java 代理在 tomcat 服务器上收集信息。 我尝试使用此代码示例:

private Iterable<String> collectAllDeployedApps() {
    try {
        final Set<String> result = new HashSet<>();
        final Set<ObjectName> instances = findServer()
                .queryNames(new ObjectName("Tomcat:j2eeType=WebModule,*"), null);
        for (ObjectName each : instances) {
            result.add(substringAfterLast(each.getKeyProperty("name"), "/")); //it will be in format like //localhost/appname 
        }
        return result;
    } catch (MalformedObjectNameException e) {
         //handle
    }
}

取自 a similar question 但由于 我没有登录管理器 应用程序,我没有正确的权限,所以我得到一个空列表。

我真正想要的 - 我有一个 java 代理(基于 aspectJ),我希望在 runtime/deployment 时间等期间能够获取所有已部署应用程序的列表无需亲自登录管理器。 我怎样才能做到这一点?我不介意检测 tomcat 的部署代码(这不需要我这边的任何登录,因为我已经在检测代码),但我不确定要检测哪个函数。

谢谢, 林

问题由两部分组成:

  • 获取所有已部署应用程序的列表 - 在查看 Tomcat 的 API 后,我发现了几个可以检测的相关部署代码部分: WarWatcher.java(允许检测变化),我们还可以看到在 stratup 上调用的来自 - UserConfig.java which is called on startup (instrumentation can be done on setDirectory name etc.), and of course HostConfig.java 的应用程序:

    protected void org.apache.catalina.startup.HostConfig.deployWARs(java.io.File, java.lang.String[])
    
    protected void org.apache.catalina.startup.HostConfig.deployApps()
    
    protected void org.apache.catalina.startup.HostConfig.deployWAR(org.apache.catalina.util.ContextName, java.io.File)
    

    此外 - 您可以检查参数:

    protected boolean org.apache.catalina.startup.HostConfig.deploymentExists(java.lang.String)
    

    它包括 war/folder 名称(通常表示应用程序名称+-)。

  • 获取根应用程序名称 - 这可以通过使用 ServletContext.getRealPath() 来完成 - 它 returns 文件夹名称,可以从中提取 war 名称(并且可以使用,在我的例子中至少作为应用程序名称)。