背景
项目中使用CodeSmith生成通用的JAVA代码文件。但是复制到项目文件中,使用Maven编译时,会报页面有非法字符。错误信息如下:
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] \src\main\java\com\web\controller\XXXXController.java:[1,0] 错误: 非法字符: '\ufeff'
[ERROR] \src\web\src\main\java\com\web\controller\xxxxxController.java:[1,9] 错误: 需要class, interface或enum
原因
经过一顿搜索,发现是CodeSmith生成的文件格式为“UTF-8 BOM+” 。而在maven编译时,不支持此格式。
解决
找到原因后,那就只需要在文件生成之后,再将UTF-8 BOM+的格式转换成UTF-8格式即可。
CodeSmith使用的是c#的为模板语言,万幸当年做过几年C#开发。通过以下代码转换,即可生成UTF-8的文件。
// 增加引用IO命名空间
<%@ Import NameSpace="System.IO" %>
// 。。。。。。
<script runat="template">
// 文件生成代码
private void RenderTamplate(String editableFileName) {
entityTemplate businessObject = this.Create<entityTemplate>();
// 老方法,使用 UTF-8 BOM + 格式
// businessObject.RenderToFile(new OutputFile(editableFileName), true);
if (!Directory.Exists(Path.GetDirectoryName(editableFileName)))
{
Directory.CreateDirectory(Path.GetDirectoryName(editableFileName));
}
// 使用UTF-8格式写文件
using (FileStream fs = new FileStream(editableFileName, FileMode.Create, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs, new System.Text.UTF8Encoding(false))) // false表示使用UTF-8格式。
{
sw.Write(businessObject.RenderToString());
sw.Flush();
fs.Flush();
}
}
}
</script>
参考文章: