【问题标题】:How to know the path of the war of the current application in tomcat在tomcat中如何知道当前应用的战争路径
【发布时间】:2011-06-27 16:57:56
【问题描述】:

我有一个 tomcat(带有 JSF)应用程序。我想知道当前应用的战争路径。

我试过下面的代码来知道tomcat在哪里 ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getRealPath("")

但是,在我将antiResourceLocking="true" 添加到上下文定义后,前面的命令返回了一个临时目录。

我一直在调试,我在

中看到了
((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext())

有一个名为 context 的变量,它有一个名为 docBase 的属性,其中包含我需要的信息。但是我无论如何都无法得到这个。

这样做的原因是:我正在做一个自动更新系统,所以我需要获取当前的战争以便对其应用一些补丁。因此我需要当前的战争文件路径。

【问题讨论】:

  • 为什么需要知道未展开WAR的根位置?这种需求背后的功能需求是什么?可能会有更好的解决方案。
  • 我正在做一个自动更新系统,所以我需要获取当前的战争以对其应用一些补丁。因此我需要当前的war文件路径。
  • 所以我个人建议你在其他地方定义一条不同于战争内部的路径。动态修改内容可能会产生一些不需要的副作用,因为 servlet 规范不打算这样做。
  • 我只需要战争的路径,所以我可以复制它,修改战争并使用tomcat管理器重新部署它。

标签: java jsf tomcat deployment


【解决方案1】:

要么不可能,要么没有人知道如何解决这个问题。

【讨论】:

    【解决方案2】:

    老实说,我不得不说这是不可能的,或者只有像这样的一些非常容易出错的黑客攻击

    我假设FacesContext.getCurrentInstance().getExternalContext().getContext()的真实类在这种情况下是org.apache.catalina.core.StandardContext

    所以你可以像这样访问docBase

    javax.faces.context.ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    if(externalContext instanceof org.apache.catalina.core.StandardContext) {
       String path = ((org.apache.catalina.core.StandardContext)externalContext .getContext()).getDocBase();
    }
    

    但这在我看来不是一个解决方案,因为您高度依赖于 tomcat 的内部结构。仍存在以下问题: * 你不能保证它真的是StandardContext 的一个实例 * 如果这适用于给定的 tomcat 版本,它可能会停止工作,恕不另行通知 * 在任何情况下它都不能在任何其他应用服务器上运行

    如果只是按照您通过调试此字段所发现的那样完成此答案。一般来说,调试您通过 API(此处为 servlet API)访问的一些代码,然后找到一种方法来访问此 API 未正确提供的 som 内部,即使理论上是可能的,这是一种非常糟糕的做法。

    【讨论】:

    • 不,不是。它返回ServletContext。另见 API 文档:download.oracle.com/javaee/6/api/javax/faces/context/…
    • 我一直在努力寻找这个,所以,查看是否可以访问的一个好方法是调试它是否存在。我不想得到这个确切的变量,只是它在那里,所以它可以从另一个类访问。
    • 我同意 BalusC 的观点,即 API 只确保我们可以访问实现 SevletContext 接口的东西。除了您提到的 getRealPath() 之外,这不会让我们访问应用服务器上的路径。所以这里唯一的方法就是按照我的建议对应用服务器做一些假设,但真的不建议这样做。
    • 或许能告诉我们获得这条路的动机是什么,我们可能会帮助您找到解决问题的方法。
    • 正如我之前评论的:“我正在做一个自动更新系统,所以我需要获取当前的战争以对其应用一些补丁。因此我需要当前的战争文件路径。 "
    猜你喜欢
    • 1970-01-01
    • 2015-06-19
    • 2023-03-26
    • 1970-01-01
    • 2016-04-30
    • 2017-08-22
    • 1970-01-01
    • 2010-10-10
    • 2017-01-28
    相关资源
    最近更新 更多