繁体   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