spring 异常错误:姓名

mv1qrgav  于 2022-10-30  发布在  Spring
关注(0)|答案(2)|浏览(149)

“它在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]
6mzjoqzu

6mzjoqzu1#

这可能有点晚了,但我最近在Windows上遇到了同样的错误,并用一个肮脏的黑客修复了它。我希望未来寻找同样问题的人会发现这对他们的问题有用。
首先,eclipse以一种不同的方式“运行”你的Sping Boot 应用程序。它不做java -jar foo.jar,而是直接引用所有的类和库,即java -classpath xxx/target/classes:a.jar:b.jar...。所以在eclipse中运行的时候会有不同的表现。
我想您遇到的情况和我一样,您有一个Sping Boot 应用程序,您希望将其打包为可执行jar,您引用了外部依赖项,但无法修复这些外部依赖项中的错误。
我发现,在我使用的外部库内部的某个地方生成了一个临时文件,并使用Java的ClassLoader阅读该文件,但Sping Boot 的LaunchedURLClassLoader无法处理Windows的“x:\”语法
在我的情况下,它是

URL findResource(name): C:\foo\bar.xml

因此,这个方法是构建自己的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);
        }
    }
    ....
}
qyzbxkaa

qyzbxkaa2#

我在使用JasperReport时遇到了这个问题,当我在文本编辑器中打开JRXML文件时,我解决了这个问题,例如(记事本,记事本++).在这个文件里面有几个对“name”标记的引用,其中一个,是引用硬盘上固定路径中的一个图像,导致,当我在另一台机器上运行应用程序时,直接通过jar文件,将显示错误“java.lang .非法参数异常:名称”
为了解决这个问题,我删除了一个硬引用图像,如下图所示:
[“D:\项目\报告\徽标. png”]
并将图像作为报表参数中的ImputStream传递给JRXML

相关问题