我有一个tomcat(带JSF)应用程序。我想知道当前申请战争的路径。
我尝试了以下代码来了解tomcat的位置
((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getRealPath("")
但是,在我将antiResourceLocking="true"
添加到上下文定义之后,上一个命令将返回一个临时目录。
我一直在调试,我在
中看到了((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext())
有一个名为context的变量,其中一个属性名为docBase,其中包含我需要的信息。但是我无论如何都无法得到这个。
原因是:我正在做一个自动更新系统,所以我需要获得当前的战争才能应用一些补丁。因此我需要当前的war文件路径。
答案 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内部结构是非常糟糕的做法,即使它在理论上是可行的。