【问题标题】:How does gradle decide the file.encoding JVM system property?gradle 如何决定 file.encoding JVM 系统属性?
【发布时间】:2020-11-11 12:16:54
【问题描述】:

在编译、运行测试或运行主类时,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 很可能使用默认编码,这似乎是正确的。

PrintCharset.java

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 中的默认字符集是ultimately determined by nl_langinfo()

printlang.c

#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 &amp;&amp; ./printlang 打印出ISO-8859-1

【问题讨论】:

  • 还有一个打开的issue请求UTF-8作为启动deamon时的默认编码。

标签: java gradle character-encoding system-properties


【解决方案1】:

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

还有更多信息:

大概是您的平台默认设置。 gradle 经历了一条长链。首先是任务本身的显式覆盖,然后有能力为所有此类任务覆盖这个值(这是你的 gradle 的 sn-p 所做的),然后是 GRADLE_OPTS=-Dfile.encoding=.... 选项,如果任务,gradle 会查看本身并没有明确选择一个。文档或多或少到此结束,但大概它会回退到 Charset.defaultEncoding() 返回的任何内容(您可以编写一个 1-liner java 应用程序并打印它,看看),而且 gradle 只需检索这个字符集的名称,然后在它设置编码的任何地方应用它(无论是java -Dfile.encodingjavac -encoding),而不是编写大量if 语句以避免在未设置显式编码时发送-Dfile.encoding-encoding全部。

【讨论】:

    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2017-09-24
    相关资源
    最近更新 更多