[英]java.util.logging breaks on wsl with spaces in paths
我有一個小的 Java 項目設置,其中包含 3 個文件Foo.java
、 logging.properties
和build.gradle
,如下所示。
在Foo.java
中,我運行以下
package foo;
import java.util.logging.Logger;
public class Foo {
public static void main(String[] args) {
var file = Foo.class.getClassLoader().getResource("logging.properties").getFile();
System.setProperty("java.util.logging.config.file", file);
var l = Logger.getLogger(Foo.class.getName());
l.info("HOLA!");
}
}
而相應的屬性文件很簡單
handlers=java.util.logging.ConsoleHandler
gradle 文件很簡單。
apply plugin: 'java'
sourceCompatibility = 11
targetCompatibility = 11
它們的結構如下
foo/
├─ src/
│ ├─ java/
│ │ ├─ main/
│ │ │ ├─ foo/
│ │ │ │ ├─ Foo.java
│ ├─ resources/
│ │ ├─ logging.properties
├─ build.gradle
運行代碼,我寫
gradle build
java -cp build/classes/java/main/:build/resources/main/ foo.Foo
現在我的問題是:如果我在/mnt/c/Users/Ludvig/Desktop/logtest/root
中找到root
,一切正常。 如果我將路徑更改為/mnt/c/Users/Ludvig/Desktop/log test/root
我沒有日志 output。 請注意,它靜默失敗,因此程序運行。 但記錄失敗? 該怎么辦?
呼吁
Foo.class.getClassLoader().getResource("logging.properties")
返回一個 url,因此在調用getFile
時,空格是 url 編碼的,路徑變為/mnt/c/Users/Ludvig/Desktop/log%20test/foo/build/resources/main/logging.properties
。 這不是LogManager
可以為 config 解析的路徑,因此未成功設置日志記錄。
調用file = file.replace("%20", " ")
解決了這個問題。
然而,這似乎是一個丑陋的黑客,我希望看到針對這個問題提出更好的解決方案。
我也會非常感謝那些不會默默失敗的解決方案......
您可以通過執行以下操作將 URL 轉換為文件:
package foo;
import java.util.logging.Logger;
import java.io.File;
public class Foo {
public static void main(String[] args) throws Exception {
var file = new File(Foo.class.getResource("logging.properties").toURI());
System.setProperty("java.util.logging.config.file", file.getCanonicalPath());
var l = Logger.getLogger(Foo.class.getName());
l.info("HOLA!");
}
}
您不必將 URL 轉換為文件。 只要您的代碼在運行任何其他代碼之前顯式重新配置記錄器, LogManager
就支持InputStream
對象。
package foo;
import java.util.logging.Logger;
private static final Logger logger;
static {
try (InputStream in = Foo.class.getResourceAsStream("logging.properties")) {
//LogManager.readConfiguration(in); //JDK 8
LogManger.updateConfiguration(in, (k) -> ((o, n) -> n)); //JDK 9+
} catch(IOException ioe) {
throw new ExceptionInInitializerError(ioe);
}
logger = Logger.getLogger(Foo.class.getName());
}
public class Foo {
public static void main(String[] args) throws Exception {
logger.info("HOLA!");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.