【问题标题】:java.lang.IllegalArgumentException: namejava.lang.IllegalArgumentException:名称
【发布时间】:2018-12-14 16:17:42
【问题描述】:

“它在 Eclipse 中工作正常,但是当我创建 jar 并运行它时,它会给我这个异常。这是我正在使用的非 Web Spring Boot 应用程序,我应该作为独立 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]

【问题讨论】:

  • 您的类路径似乎设置不正确
  • 我该如何解决?
  • 是的,但我使用的是 spring boot,所以它会将所有依赖 jar 添加到其中!!!

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


【解决方案1】:

可能有点晚了,但我最近在 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

所以 hack 是构建自己的LaunchedURLClassLoader 并将其替换为可执行 jar。如果你打开可执行jar包,你会在org\springframework\boot\loader下找到LaunchedURLClassLoader.class。想法是将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);
        }
    }
    ....
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2019-04-20
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多