激活资源过滤后编码错误

时间:2013-01-14 21:27:41

标签: maven encoding character-encoding maven-3

我正在开发一个基于maven的web项目。在我的网络模块中,我使用不同语言的特定资源包(德语,西班牙语......)。 我所有的资源都是基于UTF-8而且一切正常。 现在有必要根据不同的maven配置文件来激活maven资源过滤来替换一些配置。

我的pom.xml:

.....
 <project xmlns="http://maven.apache.org/POM/4.0.0"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
.....

 <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>    
 <build>
 <resources>
    <resource>
    <directory>src/main/resources</directory>
        <filtering>true</filtering>             
    </resource>      
 </resources>
 ....

从此刻起,我的war文件包含编码错误的资源包。例如,德语变音符号不再正确显示在我的Web应用程序中。 当我禁用资源过滤时,一切都很好。

我找到的唯一解决方案是将属性project.build.sourceEncoding设置为&#39; ISO-8859-1&#39;

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

但我不明白为什么这是必要的?我的所有来源都是UTF-8,我的应用程序也是基于UTF-8? 如果我需要添加一个资源包 - 例如日文字符会怎么样?

我正在使用Eclipse 4.2和Maven 3在Linux上进行开发

6 个答案:

答案 0 :(得分:4)

您可以在资源插件配置中指定编码,如下所示:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          ...
          <encoding>UTF-8</encoding>
          ...
        </configuration>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

Link to the Docs

答案 1 :(得分:3)

您确定资源包(.properties)正在使用UTF-8吗?

java.util.Properties假设资源包编码为ISO-8859-1,请参阅http://docs.oracle.com/javase/6/docs/api/java/util/Properties.html#load(java.io.Reader),我认为Eclipse(以及IntelliJ IDEA)尊重这些文件的默认编码(.properties)。

因此,请使用文本编辑器检查项目源代码树中这些文件的当前编码,在Windows 记事本2 中可以帮助您解决此问题。

然后配置maven-resources-plugin,如此处所示Configure encoding for different filetypes in maven?

答案 2 :(得分:1)

我今天遇到了同样的问题。将project.build.sourceEncoding设置为UTF-8将不起作用。所有过滤后的文件都将被复制到ISO-8859-1中(实际上我没有测试,但我确定它们未在UTF-8中复制)。
我的解决方案是声明两个<resource>部分。一个包含您真正需要过滤的所有文件。另一个将<filtering>设置为false的其他资源复制 它对我有用,因为当构建只包含ASCII字符时,我不需要过滤I18N文件和需要设置值的文件。

答案 3 :(得分:0)

不是你的问题的答案(对不起),但我认为这是关于财产的有用信息project.build.sourceEncoding

此属性试图简化maven项目中的编码管理。

这个想法是,只要在插件配置中没有指定编码,所有插件都会将其用作默认编码值。 使用或不使用此属性作为默认编码值仅是插件开发人员的建议。

我认为这是在所有主要和最近的插件中完成的,但一个重要的例外是版本2.2之前的maven-war-plugin

来源:

  • 关于project.build.sourceEncoding的讨论是here
  • war-plugin编码详情为here

答案 4 :(得分:0)

在Windows&gt;偏好设置&gt;常规&gt;工作区中,有一个用于“文本文件编码”的单选按钮。我有UTF-8设置,它在代码中打破了我所有的特殊字符。

作为Windows中的默认值我认为是“Cp1252”。

答案 5 :(得分:0)

如果我们假设文件

  

BundleAppl.properties

是我要过滤的文件,但其他所有资源都不应:

<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>BundleAppl.properties</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <excludes>
                    <exclude>BundleAppl.properties</exclude>
                </excludes>
            </resource>
        </resources>
</build>

因此,我可以定义两个捆绑文件。一个带有普通文本的东西,包括Umlauts等,另一个是带有捆绑物的技术捆绑文件,如....

  • pom.version
  • build.date

.......