簡體   English   中英

java.util.logging 在 wsl 上中斷,路徑中有空格

[英]java.util.logging breaks on wsl with spaces in paths

我有一個小的 Java 項目設置,其中包含 3 個文件Foo.javalogging.propertiesbuild.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.

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