为什么 maven-resources-plugin 忽略我的字符集编码设置?
Why maven-resources-plugin ignores my charset encoding setting?
我有一个为 linux 和 IBM 大型机双重构建的 java 工件,所有相关的 shell 脚本(在 /sbin 目录中)最初都是用 ASCII 编写的,但是复制到另一个目录(在 /sbin-ebcdic 中)。所以我配置了 maven-resources-plugin 来为我做这件事:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-sbin</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/sbin-ebcdic</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/sbin</directory>
</resource>
</resources>
<encoding>IBM037</encoding>
</configuration>
</execution>
</executions>
</plugin>
虽然它确实复制了整个目录,但其中的所有文件仍采用 UTF-8 编码,就好像我的:
<encoding>IBM037</encoding>
设置不存在。为什么 maven-resources-plugin 没有按预期运行?这是一个错误吗?
如果你仔细阅读 resources:copy-resources 的文档,它是这样说的 <encoding>
:
The character encoding scheme to be applied when filtering resources.
如果您不进行过滤,resources
插件将简单地逐字节复制。如果您希望它使用指定的编码 转换 资源,您需要启用过滤,即使您没有使用 属性 插值。
已编辑:
我刚刚确认了。读取 和写入文件时 都使用指定的编码,这似乎违反直觉。如果您查看 maven-resources-plugin:3.0.1
的依赖链中 DefaultMavenFileFilter.java
中的第 144 行:
143 fileReader = getFileReader( encoding, from );
144 fileWriter = getFileWriter( encoding, to );
145 Reader src = readerFilter.filter( fileReader, true, wrappers );
146
147 IOUtil.copy( src, fileWriter );
当我在调试时将 getFileWriter()
的编码更改为 UTF-8
时,它按预期工作。
基本上,您有几个选择:
- 编写自己的插件。对于这种类型的用例来说并不难。
- 向维护人员提交改进单(如果你不这样做,我正在考虑自己做)以引入
<outputEncoding>
配置参数。
- 如果您手头紧,请创建您自己的插件分支。显然,如果您能为主要开发流程贡献您的工作,那就太好了。
我有一个为 linux 和 IBM 大型机双重构建的 java 工件,所有相关的 shell 脚本(在 /sbin 目录中)最初都是用 ASCII 编写的,但是复制到另一个目录(在 /sbin-ebcdic 中)。所以我配置了 maven-resources-plugin 来为我做这件事:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-sbin</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/sbin-ebcdic</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/sbin</directory>
</resource>
</resources>
<encoding>IBM037</encoding>
</configuration>
</execution>
</executions>
</plugin>
虽然它确实复制了整个目录,但其中的所有文件仍采用 UTF-8 编码,就好像我的:
<encoding>IBM037</encoding>
设置不存在。为什么 maven-resources-plugin 没有按预期运行?这是一个错误吗?
如果你仔细阅读 resources:copy-resources 的文档,它是这样说的 <encoding>
:
The character encoding scheme to be applied when filtering resources.
如果您不进行过滤,resources
插件将简单地逐字节复制。如果您希望它使用指定的编码 转换 资源,您需要启用过滤,即使您没有使用 属性 插值。
已编辑:
我刚刚确认了。读取 和写入文件时 都使用指定的编码,这似乎违反直觉。如果您查看 maven-resources-plugin:3.0.1
的依赖链中 DefaultMavenFileFilter.java
中的第 144 行:
143 fileReader = getFileReader( encoding, from );
144 fileWriter = getFileWriter( encoding, to );
145 Reader src = readerFilter.filter( fileReader, true, wrappers );
146
147 IOUtil.copy( src, fileWriter );
当我在调试时将 getFileWriter()
的编码更改为 UTF-8
时,它按预期工作。
基本上,您有几个选择:
- 编写自己的插件。对于这种类型的用例来说并不难。
- 向维护人员提交改进单(如果你不这样做,我正在考虑自己做)以引入
<outputEncoding>
配置参数。 - 如果您手头紧,请创建您自己的插件分支。显然,如果您能为主要开发流程贡献您的工作,那就太好了。