问题现象
在Windows 7(64-bits)+eclipse Oxygen(4.7.3a)环境中,构建dble(2.18.07.2及之前)的过程中,构建结果(dble-2.17.09.1-YYYYMMDDHHMMSS-linux.tar.gz)的conf/wrapper.conf文件的换行符是CRLF(Windows换行符)——导致启动dble的时候,报错wrapper.conf有误。
问题分析
在源代码原件(src/main/resouces/wrapper.conf)中,换行符是正确的LF(Unix换行符)。尝试了在Linux上编译dble,CRLF问题就不会出现。这说明在构建过程中,有plugin受环境变量的影响,替换了wrapper.conf的换行符。
解决方法
一般来说,应该是得揪出替换wrapper.conf的换行符的Maven的plugin,然后看看它有没有参数能够调整——但由于对dble的构建lifecycle的行为不太熟悉,于是没有正面刚这个问题,而是干预打包阶段的动作,让打包插件帮我把换行符再替换回来。
dble使用maven-assembly-plugin进行打包,其配置文件src/main/assembly/assembly-linux.xml中,可以通过调整<fileSet>的lineEnding属性(property),来设置打包前,对源目录(构建过程的前些阶段中编译好的文件)进行换行符替换。
在构建中,靠前的阶段,处理过wrapper.conf后,会将它扔到target/generated-resources/appassembler/jsw/dble/conf里,等待打包。所以,对于这个问题,我们的解决方法,是在配置文件(assembly-linux.xml)中,给对应的<fileSet>加上<lineEnding>:
<fileSet>
<!-- 打包前将该目录下的文件换行符替换成LF -->
<lineEnding>unix</lineEnding>
<directory>target/generated-resources/appassembler/jsw/dble/conf</directory>
<outputDirectory>dble/conf</outputDirectory>
<includes>
<include>*</include>
</includes>
</fileSet>
经过实测,问题解决。
预防措施
继续分析构建的lifecycle,找到打包前处理wrapper.conf并替换了换行符的plugin。查找它的文档,看看能否限制它不要替换换行符或限定它只替换成LF(dble默认跑在Linux中)。然后向dble项目自身提PR。