問題現(xiàn)象
在Windows 7(64-bits)+eclipse Oxygen(4.7.3a)環(huán)境中,構(gòu)建dble(2.18.07.2及之前)的過程中,構(gòu)建結(jié)果(dble-2.17.09.1-YYYYMMDDHHMMSS-linux.tar.gz)的conf/wrapper.conf文件的換行符是CRLF(Windows換行符)——導(dǎo)致啟動dble的時候,報錯wrapper.conf有誤。
問題分析
在源代碼原件(src/main/resouces/wrapper.conf)中,換行符是正確的LF(Unix換行符)。嘗試了在Linux上編譯dble,CRLF問題就不會出現(xiàn)。這說明在構(gòu)建過程中,有plugin受環(huán)境變量的影響,替換了wrapper.conf的換行符。
解決方法
一般來說,應(yīng)該是得揪出替換wrapper.conf的換行符的Maven的plugin,然后看看它有沒有參數(shù)能夠調(diào)整——但由于對dble的構(gòu)建lifecycle的行為不太熟悉,于是沒有正面剛這個問題,而是干預(yù)打包階段的動作,讓打包插件幫我把換行符再替換回來。
dble使用maven-assembly-plugin進行打包,其配置文件src/main/assembly/assembly-linux.xml中,可以通過調(diào)整<fileSet>的lineEnding屬性(property),來設(shè)置打包前,對源目錄(構(gòu)建過程的前些階段中編譯好的文件)進行換行符替換。
在構(gòu)建中,靠前的階段,處理過wrapper.conf后,會將它扔到target/generated-resources/appassembler/jsw/dble/conf里,等待打包。所以,對于這個問題,我們的解決方法,是在配置文件(assembly-linux.xml)中,給對應(yīng)的<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>
經(jīng)過實測,問題解決。
預(yù)防措施
繼續(xù)分析構(gòu)建的lifecycle,找到打包前處理wrapper.conf并替換了換行符的plugin。查找它的文檔,看看能否限制它不要替換換行符或限定它只替換成LF(dble默認跑在Linux中)。然后向dble項目自身提PR。