如何在tomcat中了解当前应用程序的战争路径

时间:2011-02-15 15:40:11

标签: java jsf tomcat deployment

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

我尝试了以下代码来了解tomcat的位置 ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getRealPath("")

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

我一直在调试,我在

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

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

原因是:我正在做一个自动更新系统,所以我需要获得当前的战争才能应用一些补丁。因此我需要当前的war文件路径。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

我认为在这种情况下FacesContext.getCurrentInstance().getExternalContext().getContext()

的真实类org.apache.catalina.core.StandardContext id

所以你可以像这样访问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版本,它将来可能会停止工作而不会发布通知 *在任何情况下,它都不适用于任何其他应用服务器

如果只是worte完成了这个答案,你可以通过调整这个领域来发现。一般来说,调试一些通过API(这里是servlet API)访问的代码然后找到一种方法来访问这个API未正确提供的som内部结构是非常糟糕的做法,即使它在理论上是可行的。