【问题标题】:Encoding issue when building with mvn使用 maven 构建时的编码问题
【发布时间】:2012-02-25 07:54:12
【问题描述】:

我目前正在开发一个使用 JAXB 的 Maven 插件。问题是,无论我是在 IntelliJ 中还是在控制台中启动全新安装,我都不会得到相同的结果。 JAXB 正在读取以 UTF-8 编码的 XML 文件,其中包含特殊字符。

在 IntelliJ 中,读取这些字符没有任何问题。 但在控制台中,这些字符被替换为“?” (如果我执行 sysout,我可以看到它)。

找到了我的问题的根源,但是我不是很明白,也不知道怎么解决:IntelliJ运行mvn时,增加了一个额外的参数-Dfile.encoding=UTF-8

java -classpath /usr/share/maven/boot/plexus-classworlds-2.4.jar -Dclassworlds.conf=/usr/share/maven/bin/m2.conf -Dmaven.home=/usr/share/maven -Dfile.encoding=UTF-8 org.codehaus.plexus.classworlds.launcher.Launcher clean install

当我在命令行中运行 mvn 时,我可以添加这个额外的参数,但它会出现在 类名之后:

java -classpath /usr/share/maven/boot/plexus-classworlds-2.4.jar -Dclassworlds.conf=/usr/share/maven/bin/m2.conf -Dmaven.home=/usr/share/maven org.codehaus.plexus.classworlds.launcher.Launcher -Dfile.encoding=UTF-8 clean install

在这两种情况下,如果我 sysout 的 System.getProperty("file.encoding") 的内容,我会得到相同的值“UTF-8”,但行为不同。

当然,我使用这样的属性正确配置了我的 pom.xml:

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

我还尝试添加名为“file.encoding”的第二个属性,但没有帮助。

我的问题是:为什么这个系统属性的位置会改变我的程序的行为,当我从命令行运行 mvn 时如何解决我的问题?

提前致谢。

【问题讨论】:

  • 您使用 JAXB 的代码在 Maven 构建期间运行,对吗?另外,您为什么认为这些字符被错误地读取?也许它们只是无法在控制台输出中表示。
  • 是的,它在 Maven 构建期间运行。我确信这些字符被错误地读取,因为我使用由 JAXB 解组的对象来生成输出文件。这些文件在 IntelliJ 中生成时是正确的,但从控制台生成时不正确。另外,如果我从控制台运行正确的命令,我可以在控制台输出中看到正确的字符:)

标签: java maven-2 character-encoding intellij-idea


【解决方案1】:

正如otherquestions 中所建议的,JVM 以默认文件编码(通常是系统文件编码)开始,每次使用 Readers 和 Writers 时都会使用该编码,而无需显式编码。在运行时覆盖系统属性file.encoding 并不会改变这种行为,如果你希望它成为默认编码,你真的必须在启动JVM 时指定-Dfile.encoding。

为了解决我的问题,我在我的 Maven 插件中重用了 project.build.sourceEncoding(我在自定义插件中遇到了这个问题)在运行时覆盖 file.encoding,并使用这个 file.encoding 来实例化 InputStreamReader 和 OutputStreamWriter使用显式编码作为第二个参数。

由于 UTF-8 中的 maven-resource-plugin 正确复制了资源,我的问题就解决了:D。

【讨论】:

    【解决方案2】:

    也许尝试在你的 pom.xml 文件中包含这个 XML:

    <project>
      [...]
      <build>
        [...]
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>2.4.3</version>
          <configuration>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
    
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.2</version>
          <configuration>
            <source>1.6</source>
            <target>1.6</source>
            <encoding>UTF-8</encoding>
          </configuration>
        </plugin>
      </build>
    </project>
    

    【讨论】:

    • 我试过这个,但不幸的是它没有帮助。事实上,我注意到 Maven 已经使用了正确的编码,我可以将其视为 INFO 日志。我在资源/中仔细检查了复制的文件,它是正确的。当我的 maven 插件在 generate-sources 阶段读取 XML 时,问题稍后会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-27
    • 2010-09-27
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多