[英]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
。
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
。
出於好奇深入挖掘,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.encoding
或javac -encoding
),而不是寫一噸if
語句來避免發送-Dfile.encoding
或-encoding
時沒有明確的編碼是設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.