同事在Jenkins上打包时遇到一个错误:
[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]
乍一看是代码里出现了非法字符,可是 \ufeff 这明显不是中文之类的字符啊。联想到UTF8的BOM头是 EF BB BF, 网上搜了一下,UTF16大端顺序即为FE FF。故猜想是由于同事在编写代码时编码设置的问题。
BOM全名是Byte Order Mark,中文译作“字节顺序标记”。在这里找到一段关于 BOM 的说明:
在UCS 编码中有一个叫做 "Zero Width No-Break Space" ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 "Zero Width No-Break Space"。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 "Zero Width No-Break Space" (“零宽无间断间隔”)又被称作 BOM。
解决办法
针对上边编译错误的问题,解决方法其实很简单,只要把BOM头删掉就好了。Linux下可以这么操作:
vi -b AChinaBuyPlan.java
然后可以看到文件头有<FEFF>的字样,把它删掉即可。
Windows下需要借助工具去处理,比如Notepad++,打开文件后,菜单栏->编辑->转为UTF-8无BOM格式。