当前位置: 首页 > 知识库问答 >
问题:

当源代码中有一个非UTF8字符时,你怎么能让Gradle的构建失败呢?

戴树
2023-03-14

这是一个非常罕见的问题,但我真的希望它在发生这种情况时使构建失败:


/Users/jundai/perforce/trunk/service/test/com/mycompany/PriceFormattingTests.java:93: error: unmappable character for encoding UTF-8
       return new CurrencyModel("373959", new Price("10.20", "EUR"), "�10.20", new Price("12.10", "USD"), "$12.10");

使用Ant或在命令行上运行javac时,使用-source 1.6-source 1.7将导致失败。使用Gradle,它会打印出错误:(如果SourceCompatibility设置为6或更高),但生成仍然成功。

我尝试了各种方法将-source参数导入javac命令,用于compilejava任务,但我尝试的任何方法似乎都无法让Gradle将此报告为失败。

还有其他人碰到过这个吗?

编辑:一些更多详细信息:

如果我有一个用winansi:src/main/java/test.java编码的文件:


public class Test {
  public static void main(String[] args) {
    System.out.println("Testing UTF-8 compilation: C’est drôle, tout à coup je ne sais pas quoi dire.");
  }
}

则使用以下build.Gradle、Gradle 1.3和Java 1.7,此操作通过时不会出现错误或警告:


apply plugin: 'java'

tasks.withType(Compile) {
  options.encoding = "iso-8859-1"
}

输出为:


[1.9.3-p327] gradle$ gradle build
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test
:check
:build

BUILD SUCCESSFUL

如果删除options.encoding,或将其设置为UTF-8,将得到以下结果:


[1.9.3-p327] gradle$ gradle build
:compileJava
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire.");
                                                    ^
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire.");
                                                           ^
/Users/jbateskobashigawa/play/gradle/src/main/java/Test.java:3: error: unmappable character for encoding UTF8
    System.out.println("Testing UTF-8 compilation: C�est dr�le, tout � coup je ne sais pas quoi dire.");
                                                                     ^
:processResources UP-TO-DATE
... (more stuff)
BUILD SUCCESSFUL

1.51.61.7之间设置SourceTypeCompatibility似乎作用不大。1.5,在javac上使用-source时,将错误变为警告:。对于Gradle,它仍然是一个错误:,但有趣的是,它不会在下一个构建中重新编译,而对于1.61.7它会重新编译。

在Gradle构建时,我尝试了各种方法将-source传递到javac中,但似乎都不起作用:

不生成:


    options.compilerArgs < '-source 1.7'

生成,但不会出错(与没有标志时相同):


    options.compilerArgs << '-source'
    options.compilerArgs << '1.7'

所有这些似乎都与Gradle实际上并没有使用javac可执行文件进行编译有关--它使用的是某种JVM编译API,其中有很多非常复杂的代码。如果我尝试复制Gradle似乎正在做的事情,我可以创建一个类来编译我的类,它看起来像这样:javax/tools/compiletest.java

您可以使用以下迷你项目再现问题:https://github.com/jun-dai/gradle_utf8_compilation_issue

除了解析Gradle构建输出和基于特定错误消息的构建失败之外,有没有人知道解决这个问题的方法?

共有1个答案

施赞
2023-03-14

这似乎允许它使构建失败:


    options.fork = true
    options.forkOptions.executable = 'javac'

不确定这是否有其他的影响,但我会试一试。

 类似资料:
  • 问题内容: 我有一些来自json文件的文本。在本文中,我应用了UTF8编码,但是该编码器无法识别非标准字符,并且为大写字符,是否有一种方法可以净化我的字符串? 我的功能: 问题答案: 我找到了解决方案。 UTF8采用8位表ASCII表,而UTF16采用16位ASCII表,解决方案很简单,只需将函数修改为:

  • 无法生成ionic cordova build android--prod配置项目时出现问题:app'。 未指定compileSdkVersion。请将其添加到构建中。格拉德尔 build.gradle(app) /*根据一个或多个投稿者许可协议授权给Apache软件基金会(ASF)。有关版权所有权的更多信息,请参阅随本作品一起分发的通知文件。ASF根据Apache许可证2.0版(以下简称“许可证

  • 系统详细信息: MacOS High Sierra 禁用IPv6 个人网络(无公司网络、防火墙、代理等) 每次间隔几分钟后,我都多次尝试此命令。在尝试使用选项构建后,我得到了同样的错误。 不确定是否是连接失败的结果[IP:..]错误或者它有其他原因。这个解决方案也没有帮助。有什么指示吗?

  • 我们定制了一个产品,其中包括他们自己的phpunit测试套件。在Jenkins中,我有两个工作设置:第一个工作运行我们自己的测试套件,覆盖我们的定制,第二个工作运行现有的核心单元测试。

  • 我使用的是Unity 2019.3.3f1个人版,当我尝试构建64位时,我遇到了212个错误。我认为这是最重要的一个,所以我只是粘贴这些: 命令InvokationFailure: Gradle构建失败。C:/程序文件/统一/集线器/编辑器/2019.3.3f1/编辑器/数据/播放引擎/Android玩家\OpenJDK\bin\java.exe-classpath"C:\程序文件\统一\集线器\

  • 问题内容: 我在Ubuntu上使用Android Studio。我启动了Android Studio,创建了一个“新项目”,并从开始。它引发了以下错误: 它还显示了一个带有圆圈的PNG文件和一个透明背景,文件名为: 在我再次尝试运行该应用程序之后,我现在有2个错误,而不是一个: 您能否帮助我解决问题? 问题答案: Android尚未为64位ubuntu构建SDK,从错误中我可以说您正在64位OS上