java.lang.IllegalArgumentException:名称

时间:2018-07-06 06:02:04

标签: java spring spring-mvc spring-boot java-ee

“它在eclipse中工作正常,但是当我创建jar并运行它会给我这个异常。这是我正在使用的非Web Spring Boot应用程序,我应该以独立jar的形式运行”

yourScrollView.fullScroll(ScrollView.FOCUS_UP);

1 个答案:

答案 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);
        }
    }
    ....
}