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;
    }

 

posted on 2012-08-30 10:54  快鸟  阅读(3780)  评论(0编辑  收藏  举报