IntelliJ IDEA版权配置中Velocity模板的语法及匹配函数问题
IntelliJ IDEA 版权注释自动更新模板优化
IntelliJ IDEA的「Update Copyright」功能能自动维护代码里的版权注释,但官方文档少得可怜,只覆盖了最基础的场景。尤其是${originalComment.match()}这个JetBrains自定义的Velocity函数,官方示例推测的参数逻辑(正则、捕获组序号、后缀)实际测试根本不成立,得自己摸索正确用法才能满足复杂需求。
用户需求场景
- 新文件直接生成:
Copyright (c) 2024-2024 - 单旧年份注释更新:
Copyright (c) 1970→Copyright (c) 1970-2024 - 旧年份范围更新:
Copyright (c) 1970-1971→Copyright (c) 1970-2024 - 当前单年份更新:
Copyright (c) 2024→Copyright (c) 2024-2024 - 当前年份范围保持:
Copyright (c) 2024-2024更新时不改动
当前模板问题
用户目前使用的模板:
Copyright (c) My Company ${originalComment.match("Copyright \([Cc]\) .+ (\d{4})(?:\-\d{4})?", 1, "-")}${today.year}.
存在两个核心问题:
- 新文件中会直接显示未解析的
${originalComment.match(...)}占位符,没有处理无原有注释的场景 - 无法正确处理当前单年份(如
2024)的更新逻辑
正确的Velocity模板写法
Copyright (c) #if($originalComment.isEmpty()) ${today.year}-${today.year} #else #set($matches = $originalComment.match("Copyright \(c\) (\d{4})(?:-(\d{4}))?")) #if($matches && $matches.size() >= 2) #set($startYear = $matches.get(1)) #set($endYear = $matches.get(2)) #if($endYear == $today.year) ${startYear}-${endYear} #else ${startYear}-${today.year} #end #else ${today.year}-${today.year} #end #end
模板逻辑说明
- 新文件处理:通过
$originalComment.isEmpty()判断是否为新文件,直接生成当前年份-当前年份 - 原有注释匹配:用正则
Copyright \(c\) (\d{4})(?:-(\d{4}))?捕获起始年份(分组1)和可选的结束年份(分组2) - 更新逻辑:
- 如果原有结束年份已经是当前年,保持原格式不变(满足需求5)
- 其他所有情况(单旧年份、旧年份范围、当前单年份),统一更新为
起始年份-当前年份(覆盖需求2、3、4)
- 容错处理:如果原有注释格式不匹配正则, fallback到新文件的版权格式
内容的提问来源于stack exchange,提问作者Андрей Щеглов
相关产品推荐
相关产品推荐

