我有一个用于linux "在IBM大型机中,所有依赖的shell脚本(在/sbin dir中)最初都是用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编码,就像my:
<encoding>IBM037</encoding>
设置不存在。为什么maven-resources-plugin不能正常工作?是bug吗?
如果您仔细阅读resources:copy-resources的文档,它是这样描述<encoding>
的:
过滤资源时使用的字符编码方案。
如果您不做过滤,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>
配置参数。 - 如果你在紧要关头,创建你自己的插件分支。显然,如果你能把你的工作贡献给主要的开发流程,那就太好了。