同事在Jenkins上打包時(shí)遇到一個(gè)錯(cuò)誤:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project cpo: Compilation failure: Compilation failure:
[ERROR] /root/.jenkins/workspace/cpo-uat/src/main/java/com/linkgoo/cpo/module/worktable/entity/AChinaBuyPlan.java:[1,1] illegal character: '\ufeff'
[ERROR] /root/.jenkins/workspace/cpo-uat/src/main/java/com/linkgoo/cpo/module/worktable/entity/AChinaBuyPlan.java:[1,10] class, interface, or enum expected
[ERROR] -> [Help 1]
乍一看是代碼里出現(xiàn)了非法字符,可是 \ufeff 這明顯不是中文之類的字符啊。聯(lián)想到UTF8的BOM頭是 EF BB BF, 網(wǎng)上搜了一下代兵,UTF16大端順序即為FE FF。故猜想是由于同事在編寫代碼時(shí)編碼設(shè)置的問題。
BOM全名是Byte Order Mark,中文譯作“字節(jié)順序標(biāo)記”箩艺。在這里找到一段關(guān)于 BOM 的說明:
在UCS 編碼中有一個(gè)叫做 "Zero Width No-Break Space" ,中文譯名作“零寬無間斷間隔”的字符宪萄,它的編碼是 FEFF艺谆。而 FFFE 在 UCS 中是不存在的字符,所以不應(yīng)該出現(xiàn)在實(shí)際傳輸中拜英。UCS 規(guī)范建議我們?cè)趥鬏?a target="_blank" rel="nofollow">字節(jié)流前静汤,先傳輸字符 "Zero Width No-Break Space"。這樣如果接收者收到 FEFF居凶,就表明這個(gè)字節(jié)流是 Big-Endian 的虫给;如果收到FFFE,就表明這個(gè)字節(jié)流是 Little- Endian 的排监。因此字符 "Zero Width No-Break Space" (“零寬無間斷間隔”)又被稱作 BOM狰右。
解決辦法
針對(duì)上邊編譯錯(cuò)誤的問題杰捂,解決方法其實(shí)很簡(jiǎn)單舆床,只要把BOM頭刪掉就好了。Linux下可以這么操作:
vi -b AChinaBuyPlan.java
然后可以看到文件頭有<FEFF>的字樣嫁佳,把它刪掉即可挨队。
Windows下需要借助工具去處理,比如Notepad++,打開文件后蒿往,菜單欄->編輯->轉(zhuǎn)為UTF-8無BOM格式盛垦。