Может быть, немного поздно, но я недавно добавил ту же ошибку в Windows и исправил ее с помощью грязного хака. Я надеюсь, что будущие люди, которые ищут тот же вопрос, найдут это полезным для своей проблемы.
Прежде всего, затмите «запуск» вашего приложения Spring Boot другим способом. Это не делает java -jar foo.jar
, но ссылается на все классы и библиотеки напрямую, т.е. java -classpath xxx/target/classes:a.jar:b.jar...
. Так что время от времени в затмении будет вести себя по-другому.
Я полагаю, что вы работаете в той же ситуации, что и я, - у вас есть приложение Spring Boot, и вы хотите упаковать его как исполняемый файл jar, и вы ссылаетесь на внешние зависимости и не можете исправить то, что пошло не так внутри этих внешних зависимостей.
Я обнаружил, что где-то внутри внешней библиотеки, которую я использовал, генерируется временный файл и читается с использованием ClassLoader
Java, но Spring Boot LaunchedURLClassLoader
не может обработать синтаксис Windows x: \ 1011 *.
В моем случае это было
URL findResource(name): C:\foo\bar.xml
Так что взломать - построить свой собственный LaunchedURLClassLoader
и заменить его в исполняемом фляге. Если вы распакуете фишку, вы найдете 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);
}
}
....
}