2014-05-08 48 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)