为什么maven-resources-plugin会忽略我的charset编码设置?

时间:2016-10-17 21:10:46

标签: java maven encoding ebcdic maven-resources-plugin

我有一个针对linux和Linux双重构建的java工件。 IBM大型机,所有依赖的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没有按预期运行?这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

如果您仔细阅读resources:copy-resources的文档,则说明<encoding>

  

过滤资源时应用的字符编码方案。

如果您没有进行过滤,resources插件将只执行逐字节复制。如果您希望使用指定的编码转换资源,则需要启用过滤,即使您没有使用属性插值。

<强>编辑:

我刚刚证实了这一点。在读取写入文件时都会使用指定的编码,这似乎是违反直觉的。如果您查看DefaultMavenFileFilter.java依赖关系链中maven-resources-plugin:3.0.1的第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>配置参数。
  • 如果您处于紧张状态,请创建自己的插件分支。显然,如果你能将你的工作贡献给主要的开发流程,那就太棒了。