web工程在eclipse中的类编译路径与发布后的类编译路径问题和web工程中的资源文件读写问题
在eclipse中,如果是配的server的话,那么web工程将会发布在eclipse的安装目录下。
比如:eclipse的安装目录为E:\eclipse
工程lt5background发布的路径为E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp9\wtpwebapps\lt5background
但是工程里面的java类编译后的class文件却放在E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp9
\wtpwebapps\lt5background\WEB-INF\classes下面。
这样就给资源文件读写的测试带来了一定的麻烦。
放在WebContent(myeclipse中为WebRoot)下面的(资源)文件,发布后会在发布的工程的根目录下,即
E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp9\wtpwebapps\lt5background下
类为:Tools.java
public static String getWebClassPath() {
String result = null;
try {
File file = new File(Tools.class.getResource("/").toURI());
result = file.getAbsolutePath();
System.out.println("getWebClassPath="+result);
} catch (URISyntaxException e) {
e.printStackTrace();
}
return result;
}
上面的代码如果是在eclipse中调用运行(无论是否已经开启服务)它得到的都是eclipse中java类文件的编译路径,即
E:\workspace\lt5background\build\classes
而当在页面上调用到这个方法时(前提:服务已经开启),它得到的就是工程发布路径下的编译路径,即
E:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp9\wtpwebapps\lt5background\WEB-INF\classes
只有用到编译路径的时候才会出现上面的情况,如果是System.getProperty("user.dir")这种路径的话,不管是在eclipse中执行,还是在页面
上调用执行,它得到的都是eclipse的当前工作目录,只不过在eclipse中得到的是工程的根目录:E:\workspace\lt5background,但在页面上调
用时得到的是E:\eclipse(暂时还不知道为什么)
System.getProperty("java.class.path")在页面上调用执行时得到的系统中为jdk配置的环境变量中的classpath的值和服务器Tomcat的路径,
如:
C:\Program Files\Apache Software Foundation\Tomcat 6.0\bin\bootstrap.jar;
C:\Program Files\Java\jdk1.6.0\lib\tools.jar。
而在eclipse中调用时除了包含系统中为jdk配置的环境变量中的classpath的值外,还会多一些值,其中第一项为web工程在eclipse环境下的类
编译路径,如:
E:\workspace\lt5background\build\classes;
/*Tomcat里面lib下面的包*/
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\annotations-api.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\catalina-ant.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\catalina-ha.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\catalina-tribes.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\catalina.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\el-api.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\jasper-el.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\jasper-jdt.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\jasper.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\jsp-api.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\servlet-api.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\tomcat-coyote.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\tomcat-dbcp.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-es.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-fr.jar;
C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib\tomcat-i18n-ja.jar;
/*下面是工程所加的包*/
E:\workspace\lt5background\WebContent\WEB-INF\lib\msbase.jar;
E:\workspace\lt5background\WebContent\WEB-INF\lib\mssqlserver.jar;
E:\workspace\lt5background\WebContent\WEB-INF\lib\msutil.jar;
E:\eclipse\plugins\org.junit_3.8.2.v20090203-1005\junit.jar
总结:
我们在取路径时一般用类编译路径classpath,通过“类名.class.getResource("/")”得到,这样在发布后在页面上调用时得到的就是服务器端
的类编译路径,也就可以顺利的在页面上调用时读取到资源文件。
但是要注意:如果是web工程,在发布后类编译路径是放在WEB-INF下的classes目录下
/**得到java文件编译后的classes目录。 * 注: * 1、web工程与java工程会有不同 * 在eclipse中web工程中的java源文件编译后会放在build\classes下面, * 而一般的java项目则会直接将编译后的java源文件放在bin目录下 * 2、web工程发布后,在eclipse中调用此方法,与在页面上调用执行此方法得到的编译路径会有不同 * 在eclipse中执行此方法时返回的是eclipse工程的编译路径build\classes * 而在页面上调用此方法时,返回的是工程发布后的类编译路径WEB-INF\classes * 总结: * 这主要是看运行的环境,eclipse中调用执行,当然是返回eclipse中的类编译路径。 * 当启了服务,在页面上调用执行时,是在tomcat环境下,返回的自然是工程发布后的编译路径*/ public static String getClassesPath(){ String path = ""; path = PathGetTool.class.getResource("/").toString(); if(path.startsWith("file")){ // 当class文件在class文件中时,返回"file:/F:/ ..."样的路径 path = path.substring(6); }else if(path.startsWith("jar")){ // 当class文件在jar文件中时,返回"jar:file:/F:/ ..."样的路径 path = path.substring(10); } if(path.endsWith("/") || path.endsWith("\\")){ //使返回的路径不包含最后的"/" path = path.substring(0, path.length()-1); } return path; } public static String getClassesPath2(){ String path = ""; try { File file = new File(PathGetTool.class.getResource("/").toURI()); path = file.getAbsolutePath(); }catch (URISyntaxException e){ e.printStackTrace(); } return path; } /**此方法只能对web项目在服务器开启的情况下,在页面上调用时才有用。 *因为只有这样getClassesPath2才能得到工程发布目录下的类编译路径(在WEB-INF\classes下) *如果是普通的java工程,则只会返回类文件的编译路径*/ public static String getWebRootPath(){ String path = ""; path = getClassesPath2().split("WEB-INF")[0]; if(path.endsWith("/") || path.endsWith("\\")){ //使返回的路径不包含最后的"/"或"\" path = path.substring(0, path.length()-1); } return path; }