之前写过一篇文章名为《Java获得classes、WEB-INF目录》主要是为了获取classes和WEB-INF目录的。如果是tomcat服务器的话,默认会选择网站根目录下的WEB-INF目录,但是我在使用netbeans做开发的时候,确怎么也找不到当前目录下的WEB-INF目录,自己编写了一个java类,在java类中运行后得到的确实是当前目录下的WEB-INF目录,但是在sevelet中确证明测试也不成功,无奈又写了一个JSP页面来查看在sevelet中的相应目录。
1、首先来看相关的java类
package com.bar.safe;
import java.io.File;
import java.io.IOException;
/**
*
* @author Mr.Tao
* @date 2016-8-30 22:33:25
* @version V2.0
* @desc THIS IS TEST ! 获得WEB-INF目录测试实例
*/
public class TestDir {
public static void main(String[] args) throws IOException{
//File dir = new File("xxx.properties");
String path1 = Thread.currentThread().getContextClassLoader().getResource("").toString();
path1=path1.replace('/', '\\'); // 将/换成\
path1=path1.replace("file:", ""); //去掉file:
path1=path1.replace("classes\\", ""); //去掉class\
path1=path1.substring(1); //去掉第一个\,如 \D:\JavaWeb...
//path1+="DB.properties";
//dir.createNewFile();
//String path = dir.getCanonicalPath();//设定为当前文件夹
//System.out.println("File Path"+path);
//System.out.println("user.dir:"+System.getProperty("user.dir"));
//System.out.println("user.home:"+System.getProperty("user.home"));
System.out.println("Thread:"+path1);
}
}
运行这个java类我们可以看到glassfish输出的目录如下:

可以看到C:\Users\Administrator\Documents\NetBeansProjects\bar\build\web\WEB-INF\这个目录确实是我们目前web目录下的WEB-INF目录,但是在我真正应用的时候,确找不到这个目录下的properties文件,这到底是什么原因呢,自己老是钻牛角尖,使用了各种方法,转变了多种思路,都还是无法找到解决的方法。突然一天夜里,自己新建了一个jsp文件,把相关代码放在jsp里,我草泥马,原来sevelet解析出来的目录尽然跟上面的java类得到的目录完全不一样,差点就把我搞晕了。
2、jsp代码
<%
String path1 = Thread.currentThread().getContextClassLoader().getResource("").toString();
path1=path1.replace('/', '\\'); // 将/换成\
path1=path1.replace("file:", ""); //去掉file:
path1=path1.replace("classes\\", ""); //去掉class\
path1=path1.substring(1); //去掉第一个\,如 \D:\JavaWeb...
out.println("Thread:"+path1);
%>
上面JSP运行后显示如下:
看到了吧,是C:\Users\Administrator\personal_domain\lib\,而并非是当前WEB目录下的WEB-INF目录哦。
3、为什么会这样
以下纯属个人观点,同意请点赞,不同意勿喷。
个人认为,netbeans中使用glassfish服务器,而glassfish服务器会为当前用户创建一个属于用户自己的classes目录,glassfish的classes目录并非在WEB-INF下,而是将当前web目录下的WEB-INF下的classes目录映射到了相应的其他classes目录去了。
另外tomcat和glassfish区别就大了。tomcat默认的WEB-INF目录就在其webapps下的ROOT目录下,如果没有进行过虚拟目录的设置,那么tomcat的WEB-INF目录就是ROOT下的那个目录,永远不会改变。设置虚拟目录后,WEB-INF目录自动调整为虚拟目录下的WEB-INF目录,因此个人建议在使用netbeans做javaweb开发的时候,尽量使用tomcat作为服务器,而不要使用自带的glassfish服务器。