2014-05-08 71 views
0

以下代碼公開了這個錯誤,我知道我可以只是尾部getFile()的結果& getPath(),但我正在尋找一個大的東西更優雅健壯。我希望能夠在默認情況下以及在用戶選擇/配置路徑中查找包含jar的文件夾,以查找&加載資源。尋找java.net.URL不一致的解決方法/ bug

import java.net.MalformedURLException; 
import java.net.URISyntaxException; 
import java.net.URL; 

public class UrlBug { 

UrlBug() { 
    try { 
     final URL resourceRoot = this.getClass().getClassLoader().getResource("."); 
     System.out.println(resourceRoot.getFile()); 
     System.out.println(resourceRoot.getPath()); 
     System.out.println(resourceRoot.toURI()); 
     System.out.println(resourceRoot.toExternalForm()); 
     System.out.println(resourceRoot.toString()); 
     new URL(resourceRoot.getFile()); 
    } catch (final URISyntaxException e) { 
     e.printStackTrace(); 
    } catch (final MalformedURLException e) { 
     e.printStackTrace(); 
    } 
} 
public static void main(final String[] args) { 
    new UrlBug(); 
} 
} 

以「錯誤」

/C:/Users/Me/workspaces/.../target/classes/   <-- Malformed filename 
/C:/Users/Me/workspaces/.../target/classes/   <-- Malformed path 
file:/C:/Users/Me/workspaces/.../target/classes/ 
file:/C:/Users/Me/workspaces/.../target/classes/ 
file:/C:/Users/Me/workspaces/.../target/classes/ 

java.net.MalformedURLException: no protocol: 
/C:/Users/Me/workspaces/scratch/target/classes/  at 
java.net.URL.<init>(URL.java:585) at 
java.net.URL.<init>(URL.java:482) at 
java.net.URL.<init>(URL.java:431) at 
scratch.UrlBug.<init>(UrlBug.java:20) at 
scratch.UrlBug.main(UrlBug.java:39) 

下面產生的輸出,我很願意接受的錯誤是在我的代碼。不過我認爲這是一個URL類的問題,並且Kohsuke似乎是agree

+1

是什麼讓你覺得這是一個錯誤? –

+1

你指的是什麼錯誤/不一致? – stridecolossus

+0

@PaulTomblin如果你運行代碼,你會得到一個異常:java.net.MalformedURLException:沒有協議:/ c:/ src/other/stackoverflow/ at java.net.URL。 (URL.java:585) at java.net.URL。 (URL.java:482) at java.net.URL。 (URL.java:431) UrlBug。 (UrlBug.java:15) UrlBug.main(UrlBug.java:23) – mttdbrd

回答

0

我不知道爲什麼你要走自己的jar目錄結構。 Java有現有的類來處理這種情況。要解決你的代碼,你可以只使用toString()方法:

new URL(resourceRoot.toString()); 

「文件:/」前綴是「協議」。使用toString()方法可以保證「file:/」協議被預置爲字符串。根據文檔:

Protocol handlers for the following protocols are guaranteed to exist on the search path: 

    http, https, ftp, file, and jar 

http://docs.oracle.com/javase/7/docs/api/java/net/URL.html#URL(java.lang.String, java.lang.String, int, java.lang.String)