[原创] 如何在 Java 代码中获得 WebRoot 的物理路径?(区分 Windows 和 Linux 的情况)
第一部分:我自己的处理方法
今天要解析 IK Expression 的 IKExpression.cfg.xml 文件,以解析其中系统函数默认配置和用户函数配置,于是又遇到了一个老问题:Java Web 开发中如何获取部署目录下 WEB-INF 中 classes 的物理路径(网上也有同行描述为:获取服务器中当前WebRoot的物理路径)?
闲话不多说,我先附上代码片段:
1 pathStr = this.getClass().getClassLoader().getResource("").getPath(); 2 // 对 Windows 下获取 物理路径 做 特殊处理 3 if("\\".equals(File.separator)) { 4 pathStr = pathStr.substring(1).replaceAll("/", "\\\\"); 5 }
代码很简单,也不用过多的解释了,相信大家都能看懂的。为什么要对 Windows 下的情况做特殊处理呢?因为如果不做这个处理,得到的结果就如下图所示:
大家可以看到所有 File Separator 都是“/”,而实际我们期望的是“\”。博主用的是 Windows 8 64位版, MyEclipse 8.6 开发, Tomacat 部署,配合虚拟机里面的 Ubuntu 测试 Linux 下的运行效果。所以情况可能跟大家的不太一样,大家根据实际情况修改代码吧 o(∩_∩)o
最后的运行效果图如下:
上图是在 Ubuntu下部署后运行的效果,下图是在 Windows 8 的 MyEclipse 中运行的效果:
下面再附上 Ubuntu 中运行的截图:
这种方法是利用Java的类加载机制调用 XXX.class.getClassLoader().getResource(""); 方法来获取到 ClassPath,然后处理获得 WebRoot 目录。这种方式只能是该class在WebRoot/WEB-INF/classes下才能生效,如果该class被打包到一个jar文件中,则该方法失效。
如果有不完善的地方或更好的方法,欢迎批评指正,谢谢 o(∩_∩)o
第二部分:可供大家参考的其他“高端”做法
最后我再附上网上的其他比较“高端”的做法共大家参考:
- 如果是Servlet, Action, Controller, 或者 Filter, Listener, 拦截器等相关类时,我们只需要获得 ServletContext,然后通过ServletContext.getRealPath("/")来获取当前应用在服务器上的物理地址;
- 如果在类中取不到ServletContext时,可采用博主使用的方法,或如下方法:采用 Spring 框架的思路,在WEB-INF/web.xml中,创建一个 webAppRootKey 的 param,指定一个值(默认为 webapp.root)作为键值,然后通过Listener,或者Filter,或者 Servlet 执行 String webAppRootKey = getServletContext().getRealPath("/");并将 webAppRootKey 对应的 webapp.root 分别作为 Key , Value 写到 System Properties 系统属性中。之后在程序中通过 System.getProperty("webapp.root") 来获得 WebRoot 的物理路径。