将编码开关传递给 JVM 以执行 Gradle "JavaExec" 任务

Passing an encoding switch to the JVM for a Gradle "JavaExec" task

我遇到了一些编码问题。

这是在 W10 OS 上,但我直接使用 DOS 控制台和 Cygwin shell 到 运行 任务。在 Eclipse 中,我 运行 正在使用 Buildship 插件,对于我的 "production" 输出,我正在制作一个 "fat" jar(即包含所有依赖项 jar)。

要在 DOS 控制台中将 fat jar 传送到 运行,我这样做:

> chcp 65001
> java -jar -Dfile.encoding=UTF-8 myFatJar.jar

为了在 Cygwin 控制台中将 fat jar 传送到 运行,我省略了 "chcp" 命令

...并且这两个 运行 很好,没有编码问题。

我有一个 run 任务,看起来像这样:

task myRun(type: JavaExec, dependsOn: assemble ) {
    standardInput = System.in
    classpath sourceSets.main.runtimeClasspath
    main = "core.ConsoleHandler"
}

当我在 Eclipse(Buildship 插件)中 运行 时,没有编码问题。

当,在 gradle 目录中,我是这样的:

> gradle myRun

无论我使用的是 DOS 还是 Cygwin 控制台,我都会遇到编码问题:转至 System.out.

的 Unicode 字符出现问题

在我的 gradle.build 中(我使用的是 application 插件)我试过这个:

applicationDefaultJvmArgs = ["-Dfile.encoding=UTF-8"]

...不过这个好像没什么效果

顺便说一句,在测试期间,我有一些输出到 System.out... 当我检查 JUnit/Mockito 测试结果时,结果很好。

为了获得 "all my ducks in a row",我还尝试弄乱 Java 代码本身:我没有直接使用 System.out,而是尝试了这个:

    PrintStream out = new PrintStream(System.out, true, "UTF-8");
    out.print( message );

...但这会在 运行ning 测试时导致输出到 System.out 的编码问题!

gradle 命令 applicationDefaultJvmArgs 让我想知道是否有一种方法可以在 运行ing a JavaExec 时将 "non-default" 切换到 JVM-输入任务...

稍微晚一点

哈..这些事情就是这样:

我在 myRun 任务中添加了以下行:

jvmArgs "-Dfile.encoding=UTF-8" 

...并且 DOS 和 Cygwin 控制台 运行s 的编码问题已...解决!但是,当我在 Eclipse Buildship 中 运行 myRun 任务时,我现在遇到了编码问题!:

référé juge des ~s: "Judge sitting in Chambers to deal with urgent matters"
état juge de mise en ~: joinder of issue judge

'É' 应为 'é'(在添加此 jvmArgs 参数之前)

当然,总的来说这是一个改进......但如果能从专家那里知道这是怎么回事就好了......

有时候 是有道理的...虽然我仍然觉得编码是一个令人痛苦、令人生畏和毁灭灵魂的主题。

我的 运行 的 Eclipse "run configuration" 缺少这个 JVM 参数。添加它很简单:运行 --> 运行 配置 --> 选择 "myRun" --> Arguments 选项卡 --> JVM Arguments.

我所有的鸭子似乎都在 UTF-8 行中。万岁。