错误:在Maven编译期间,UTF8编码无法映射某些字符

69

我正在使用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。

请问有人可以告诉我该怎么做吗?

谢谢。


5
你看过SpanishTest.java文件第31行第81个字符处的内容吗? - Jon Skeet
是的,它包含像 ó、é、í 这样的字符,因此编译不成功。 - Yogesh
1
那些字符在文件中是如何表示的呢?用了哪些字节来表示它们? - Jon Skeet
是的,你绝对需要展示实际失败的字节。UTF8 是一种编码方式,这意味着它期望某些字节以特定的排列方式出现,否则就会失败。例如,你发布的那些字符对于 UTF8 来说不是问题,http://hexutf8.com/?q=20c3b3202c20c3a920,但我敢打赌你认为在 SpanishTest.java 中的内容可能有一点偏差。 - jar
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全局设置文件编码。您还可以通过Window->Preferences->General->Content Types为每种文件类型设置编码。


2
请注意,我发现了一种情况,即 project.build.sourceEncoding 不起作用。请使用 maven-compiler-plugin 的插件配置(第一个代码片段)。谢谢您的回答。 - vikingsteve
4
只有 <project.build.sourceEncoding>Cp1252</project.build.sourceEncoding> 能够正常工作。 - Barun

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)。


这是否意味着特殊字符来自Windows? - Khan
好像是的,是的。 - false9striker
对我有用 ;) : Ubuntu 18。 - JRichardsz
我也试过了,Redhat 7.9。谢谢。 - AhmedRana

12

我刚遇到了这个问题,最终是这样解决的:我在Notepad++中打开有问题的.java文件,在编码菜单中选择“转换为无BOM的UTF-8”。保存后重新运行Maven,一切都顺利通过了。

如果有问题的资源未用UTF-8编码(而你已经为你的Maven编译器插件配置了UTF-8),你会在Np++的编码菜单中看到文件当前编码的前面有一个符号(在我的情况下,我发现它被设置为“ANSI编码”)。

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


8
在以下场景中会发生这种情况: 当在Windows上工作时,IDE很可能配置为使用Cp1252编辑文件,它是Latin-11的Microsoft适配版。开发人员检入后,持续集成服务器(通常在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插件中设置编码属性对我有用。以下是代码示例:

<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,请添加以下内容:
set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接