“它在eclipse中工作正常,但是当我创建jar并运行它会给我这个异常。这是我正在使用的非Web Spring Boot应用程序,我应该以独立jar的形式运行”
yourScrollView.fullScroll(ScrollView.FOCUS_UP);
答案 0 :(得分:0)
可能有点晚了,但是我最近在Windows上遇到了同样的错误,并用一个肮脏的hack修复了它。我希望将来寻找相同问题的人会发现这对他们的问题有用。
首先,以不同的方式使Eclipse“运行” Spring Boot应用程序。它不执行java -jar foo.jar
,而是直接引用所有类和库,即java -classpath xxx/target/classes:a.jar:b.jar...
。因此,在eclipse中运行的soetime的行为会有所不同。
我想您遇到了与我相同的情况,即您有一个Spring Boot应用程序,并且希望将其打包为可执行jar,并且您正在引用外部依赖关系,并且无法修复这些外部依赖关系中出错的地方。
我发现我正在使用的外部库中的某个地方正在生成一个临时文件,并使用Java的ClassLoader
读取它,但是Spring Boot的LaunchedURLClassLoader
无法处理Windows的“ x:\”语法
就我而言,是
URL findResource(name): C:\foo\bar.xml
因此,解决方法是构建自己的LaunchedURLClassLoader
并将其替换到可执行jar中。如果打开可执行jar的包装,则会在LaunchedURLClassLoader.class
下找到org\springframework\boot\loader
。想法是将C:\foo\bar.xml
改成file:///C:/foo/bar.xml
,以便Java ClassLoader知道如何处理文件。
...
package org.springframework.boot.loader;
...
public class LaunchedURLClassLoader extends URLClassLoader {
...
@Override
public URL findResource(String name) {
// This is where I added the dirty hack
if (name.contains(":\\") && !name.startsWith("file:///")) {
System.out.println("URL findResource(name): " + name); // just for you to debug
name = "file:///" + name.replace("\\", "/");
System.out.println("URL findResource(name): Reaplced to " + name); // just for you to debug
}
Handler.setUseFastConnectionExceptions(true);
try {
return super.findResource(name);
}
finally {
Handler.setUseFastConnectionExceptions(false);
}
}
....
}