[英]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.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);
}
}
....
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.