我目前正在使用一个使用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时如何解决我的问题呢?
提前致谢。
答案 0 :(得分:1)
正如other questions中所建议的那样,JVM以默认文件编码(通常是系统文件编码)开始,每次在没有显式编码的情况下使用读取器和写入器时都会使用该编码。在运行时覆盖系统属性file.encoding
不会改变此行为,如果您希望它是默认编码,则必须在启动JVM时指定-Dfile.encoding
。
要解决我的问题,我在我的Maven插件中重用project.build.sourceEncoding
(我在自定义插件中遇到此问题)在运行时覆盖file.encoding
,并使用此file.encoding
来实例化{ {3}}和InputStreamReader使用显式编码作为第二个参数。
由于UTF-8中的maven-resource-plugin正确复制了资源,我的问题就消失了:D。
答案 1 :(得分:0)
也许尝试在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>