簡體   English   中英

gradle 如何決定 file.encoding JVM 系統屬性?

[英]How does gradle decide the file.encoding JVM system property?

在編譯、運行測試或運行主類時,gradle 使用顯式file.encoding啟動 java,例如:

/usr/bin/java -Dfile.encoding=ISO-8859-1 -Duser.country=GB -Duser.language=en
              -Duser.variant -cp … com.foo.MyMainClass

gradle 如何選擇這個默認文件編碼(對我來說是 ISO-8859-1)? 要切換到 UTF-8,我必須將以下內容添加到我的 gradle 構建腳本中:

allprojects {
    tasks.withType(JavaCompile) {
        options.encoding = 'UTF-8'
    }

    tasks.withType(Test) {
        systemProperty 'file.encoding', 'UTF-8'
    }

    tasks.withType(JavaExec) {
        systemProperty 'file.encoding', 'UTF-8'
    }
}

其中設置-Dfile.encoding=UTF-8

更新 #1

rzwitserloot指出 gradle 很可能使用默認編碼,這似乎是正確的。

打印字符集

import java.nio.charset.Charset;

public class PrintCharset {
    public static void main(String[] args) {
        System.out.println("Default: " + Charset.defaultCharset());
    }
}

然后, javac PrintCharset.java && java PrintCharset打印

Default: ISO-8859-1

有趣的是,從 IntelliJ(沒有 gradle)運行會執行:

/usr/bin/java -javaagent:… -Dfile.encoding=UTF-8 -classpath … PrintCharset

當然,它會打印Default: UTF-8

更新 #2

出於好奇深入挖掘,Linux 上 OpenJDK 中的默認字符集最終由nl_langinfo()確定

打印語言

#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
   setlocale(LC_ALL, "");
   printf("%s\n", nl_langinfo(CODESET));

   exit(EXIT_SUCCESS);
}

然后, gcc -o printlang printlang.c && ./printlang打印ISO-8859-1

TL;DR:誰知道,但可能是 Charset.defaultEncoding。

提供更多信息:

據推測,這是您的平台默認設置。 gradle 有一條長鏈。 首先是任務本身的顯式覆蓋,然后有能力為所有此類任務覆蓋此值(這是您的 gradle 片段所做的),然后是GRADLE_OPTS=-Dfile.encoding=....選項 which gradle會查看任務本身是否沒有明確選擇一個。 文檔或多或少在那里結束,但大概它會回Charset.defaultEncoding()返回的任何Charset.defaultEncoding()您可以編寫一個 1-liner java 應用程序並打印它,看看),並且對於 gradle 來說更簡單檢索該字符集的名稱,然后應用它無處不在,它集編碼(無論是java -Dfile.encodingjavac -encoding ),而不是寫一噸if語句來避免發送-Dfile.encoding-encoding時沒有明確的編碼是設置。

暫無
暫無

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

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