Java gradle如何决定file.encoding JVM系统属性?

Java gradle如何决定file.encoding JVM系统属性?,java,gradle,character-encoding,system-properties,Java,Gradle,Character Encoding,System Properties,在编译、运行测试或运行主类时,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构建脚本中添加以下内容: 所有项目{ tasks.withTypeJavaCo

在编译、运行测试或运行主类时,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构建脚本中添加以下内容:

所有项目{ tasks.withTypeJavaCompile{ options.encoding='UTF-8' } 任务.带类型测试{ systemProperty“file.encoding”,“UTF-8” } tasks.withTypeJavaExec{ systemProperty“file.encoding”,“UTF-8” } } 设置-Dfile.encoding=UTF-8

更新1 注意,gradle可能使用默认编码,这似乎是正确的

PrintCharset.java

导入java.nio.charset.charset; 公共类打印字符集{ 公共静态无效字符串[]args{ System.out.printlnfault:+Charset.defaultCharset; } } 然后,javac PrintCharset.java&&java PrintCharset打印

有趣的是,在没有gradle的情况下从IntelliJ运行执行:

/usr/bin/java -javaagent:… -Dfile.encoding=UTF-8 -classpath … PrintCharset
当然,它会打印默认值:UTF-8

更新2 出于好奇,再深入一点,linux上OpenJDK中的默认字符集是:

printlang.c

包括 包括 包括 包括 int main argc,char*argv[] { setlocaleLC_ALL; printf%s\n,nl_langinfoCODESET; 成功; }
然后,gcc-o printlang printlang.c&./printlang打印ISO-8859-1。

TL;谁知道呢,但可能是Charset.defaultEncoding

还有更多信息:

据推测,这是您的平台默认设置。格拉德穿过一条长长的链条。首先是对任务本身的显式重写,然后是对所有此类任务重写此值的能力,这就是gradle片段所做的,然后是gradle_OPTS=-Dfile.encoding=。。。。如果任务本身没有显式地选择一个,gradle将查看的选项。文档或多或少到此结束,但可能会回到Charset.defaultEncoding返回的任何内容。您可以编写一个单行java应用程序并打印出来,看一看,gradle只需检索这个字符集的名称,然后在它设置编码的任何地方应用它,无论是java-Dfile.encoding还是javac-encoding,而不是编写大量if语句,以避免在根本没有设置显式编码的情况下发送-Dfile.encoding或-encoding。

还有一个打开的请求UTF-8作为默认值在启动deamon时进行编码。
/usr/bin/java -javaagent:… -Dfile.encoding=UTF-8 -classpath … PrintCharset