C:\dev\path with spaces> java -jar myproject\build\libs\myproject-0.1-SNAPSHOT-standalone.jar
fails to start with the following root cause exception:
Caused by: java.io.FileNotFoundException: C:\dev\path%20with%20spaces\myproject\build\libs\myproject-0.1-SNAPSHOT-standalone.jar (The system cannot find the path specified)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:214)
at java.util.zip.ZipFile.<init>(ZipFile.java:144)
at java.util.jar.JarFile.<init>(JarFile.java:153)
at java.util.jar.JarFile.<init>(JarFile.java:90)
at com.simontuffs.onejar.OneJarFile.<init>(OneJarFile.java:36)
at com.simontuffs.onejar.OneJarURLConnection.connect(OneJarURLConnection.java:46)
at com.simontuffs.onejar.JarClassLoader$FileURLFactory$1.openConnection(JarClassLoader.java:1105)
at java.net.URL.openConnection(URL.java:971)
at java.net.URL.openStream(URL.java:1037)
at javax.validation.Validation$DefaultValidationProviderResolver.getValidationProviders(Validation.java:320)
... 14 more
The project works normally if the directory "C:\dev\path with spaces\..." is renamed to "C:\dev\pathnospaces\...". It does not seem to matter if the command line path to the JAR is relative or absolute as it gets transformed to the absolute path regardless.
Full stacktrace (sanitized)
The patch #8 I submitted should fix this problem.
I tracked it down to the OneJarURLConnection.java class in 0.98 (and possibly 0.97?) which uses:
//can create problems with spaces etc.
String codebase = this.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
I found a method on Stackoverflow that mentioned if you utilize the URL returned by the Location and then use File's getPath() then it will be properly encoded.
(reference: http://stackoverflow.com/questions/320542/how-to-get-the-path-of-a-running-jar-file#answer-12733172)
eg:
URL codebaseURL = this.getClass().getProtectionDomain().getCodeSource().getLocation();
String codebase = null;
try{
codebase = new java.io.File(codebaseURL.toURI()).getPath();
}catch(URISyntaxException ue){
throw new IOException("Could not convert URL to URI",ue);
}