簡體   English   中英

java.lang.IllegalArgumentException:name

[英]java.lang.IllegalArgumentException: name

“它在eclipse中工作得很好,但是當我創建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]

它可能有點晚了,但我最近在Windows上遇到了同樣的錯誤,並用骯臟的黑客修復了它。 我希望未來的人們在尋找同樣的問題會發現這對他們的問題有用。

首先,eclipse以不同的方式“運行”你的Spring Boot應用程序。 它不執行java -jar foo.jar而是直接引用所有類和庫,即java -classpath xxx/target/classes:a.jar:b.jar... 因此,在eclipse中運行的時間會有所不同。

我想你遇到了和我一樣的問題,你有一個Spring Boot應用程序,你想把它打包成可執行jar,你引用外部依賴,無法修復那些外部依賴項中出錯的地方。

我發現在我使用的外部庫中的某個地方生成一個臨時文件並使用Java的ClassLoader讀取它,但是Spring Boot的LaunchedURLClassLoader無法處理Windows的“x:\\”語法

在我的情況下,它是

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

所以黑客就是構建你自己的LaunchedURLClassLoader並在可執行jar中替換它。 如果解壓縮excutable jar,你會在org\\springframework\\boot\\loader下找到LaunchedURLClassLoader.class 我們的想法是將C:\\foo\\bar.xml重新file:///C:/foo/bar.xmlfile:///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);
        }
    }
    ....
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM