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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM