错误:在maven编译期间编码UTF8的不可映射字符

问题描述 投票:0回答:10

我正在使用 maven 编译一个包,它显示构建失败并出现以下编译错误:

SpanishTest.java[31, 81] 用于编码 UTF8 的不可映射字符

我在网上搜索了很多人,将源编码从 UTF-8 更改为 ISO-8859-1 似乎可行,但我仍然遇到相同的编译错误。我使用的是 32 位 Ubuntu。这是该标签在我的 pom.xml 中的样子

<project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>

即使我将

<project.build.outputEncoding>
标签更改为ISO-8859-1,我仍然收到错误。是否是因为java版本?我的系统上安装了-sun java 和 openjdk。

任何人都可以告诉我该怎么做吗?

谢谢

java maven character-encoding
10个回答
97
投票

将 maven-compiler-plugin 配置为使用与源文件编码相同的字符编码(例如):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

许多 Maven 插件默认使用“project.build.sourceEncoding”属性,因此在 pom 中设置此属性将覆盖大多数插件。

<project>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
...

但是,我更喜欢在每个支持它的插件配置中设置编码,因为我喜欢明确。

当您的源代码由 maven-compiler-plugin 编译时,编译器插件将使用编译器插件配置的任何编码读取源代码文件。如果您的源文件的编码与编译器插件使用的编码不同,那么某些字符可能在两种编码中都不存在。

许多人喜欢将源文件的编码设置为UTF-8,以避免这个问题。要在 Eclipse 中执行此操作,您可以右键单击项目并选择“属性”->“资源”->“文本文件编码”并将其更改为 UTF-8。这会将所有源文件编码为 UTF-8。 (您还应该如上所述显式配置 maven-compiler-plugin 以使用 UTF-8 编码。)如果源文件和编译器插件都使用相同的编码,您在编译期间不应再有任何不可映射的字符。

注意,您还可以通过 Window->Preferences->General->Workspace->Text File Encoding 在 Eclipse 中全局设置文件编码。您还可以通过“窗口”->“首选项”->“常规”->“内容类型”设置每种文件类型的编码。


29
投票

如果上述答案不起作用,请将编码更改为 cp1252 或手动删除所有出现的特殊字符。对我来说,特殊字符导致了评论块内的问题。

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>2.3.2</version>
   <configuration>
       <encoding>Cp1252</encoding>
   </configuration> 
</plugin>

PS:我使用的是 GNU/Linux 操作系统(Ubuntu)。


12
投票

我刚刚遇到了这个问题,最终像这样解决了它:我在 Notepad++ 中打开了有问题的 .java 文件,并从编码菜单中选择了“转换为没有 BOM 的 UTF-8”。已保存。重新运行maven,一切顺利。

如果有问题的资源没有以 UTF-8 编码 - 正如您为 Maven 编译器插件配置的那样 - 您会在 Np++ 的编码菜单中看到文件的 current 编码旁边有一个项目符号(在我的例子中我看到了它)设置为“以 ANSI 编码”)。

因此,您的 maven 编译器插件调用了 Java 编译器,并将 -encoding 选项设置为 UTF-8,但编译器遇到了 ANSI 编码的源文件,并将其报告为错误。这曾经是 Java 5 中的警告,但在 Java 6+ 中被视为错误


8
投票

这会发生在以下场景中: 在 Windows 上工作时,IDE 很可能配置为编辑 Cp1252 中的文件,Cp1252 是 Microsoft 对 latin-11 的改编。开发人员签入,持续集成服务器(通常在 Linux 上运行,现在都是 utf8)拾取该文件,并尝试编译为 UTF-8 文件,因此出现警告。

尝试将编码更改为cp1252。这有效。为了避免将来出现此类问题,请在所有开发人员计算机上使用相同的编码。

祝你好运...


6
投票

就我而言,我使用这种方法解决了该问题:

  1. 设置新的环境变量:
    JAVA_TOOL_OPTIONS = -Dfile.encoding=UTF8
  2. 或设置
    MAVEN_OPTS= -Dfile.encoding=UTF-8

1
投票

我也遇到了类似的问题,但我的解决方案不同。我转到提到的代码行并遍历到字符(对于SpanishTest.java[31, 81],转到第31行和第81个字符,包括空格)。我在评论中发现了引起问题的撇号。虽然不是一个错误,但 Maven 编译器报告了问题,在我的例子中,可以删除 Maven 的“非法”字符..哈哈。


1
投票

当我检查控制台时,我发现maven编译器的版本是2.5.1,但在另一边我尝试使用maven 3.2.2构建我的项目。所以在pom.xml中写入确切的版本后,它工作得很好。 这是完整的标签:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.2</version>
  <configuration>
   ....
  <configuration>
</plugin>

0
投票

在 maven-compiler 插件中设置 incodign 属性对我有用。代码示例如下

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

0
投票

我猜问题发生在编码字符串上。我解决了同样的问题。请尝试在编码字符串的最后添加trim()。


0
投票

如果您使用 wsimport 添加: 设置 JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

© www.soinside.com 2019 - 2024. All rights reserved.