[英]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.