java.lang.IllegalArgumentException: имя - PullRequest
0 голосов
/ 06 июля 2018

"он отлично работает в затмении, но когда я создаю jar и запускаю, это дает мне это исключение. Это не веб-приложение с весенней загрузкой, которое я использую, которое я должен запускать как автономный jar"

java.lang.IllegalArgumentException: name
                    at sun.misc.URLClassPath$Loader.findResource(Unknown Source) ~[na:1.8.0_171]



at sun.misc.URLClassPath.findResource(Unknown Source) ~[na:1.8.0_171]
                    at java.net.URLClassLoader$2.run(Unknown Source) ~[na:1.8.0_171]
                    at java.net.URLClassLoader$2.run(Unknown Source) ~[na:1.8.0_171]
                    at java.security.AccessController.doPrivileged(Native Method) ~[na:1.8.0_171]
                    at java.net.URLClassLoader.findResource(Unknown Source) ~[na:1.8.0_171]
                    at org.springframework.boot.loader.LaunchedURLClassLoader.findResource(LaunchedURLClassLoader.java:58) ~[extension-0.0.1-SNAPSHOT.jar:0.0.1-SNAPSHOT]
                    at java.lang.ClassLoader.getResource(Unknown Source) ~[na:1.8.0_171]
                    at java.net.URLClassLoader.getResourceAsStream(Unknown Source) ~[na:1.8.0_171]

1 Ответ

0 голосов
/ 19 июля 2019

Может быть, немного поздно, но я недавно добавил ту же ошибку в 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);
        }
    }
    ....
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...