使用ScriptRunner JQL查询超1年未更新问题数遇方法缺失错误求修复
修复Jira ScriptRunner查询更新超1年问题数量的Groovy脚本错误
问题场景
需要通过ScriptRunner脚本控制台查询Jira所有项目中最后更新时间超过1年的问题数量,原运行脚本时报错。
错误信息
groovy.lang.MissingMethodException: No signature of method: com.atlassian.jira.issue.search.providers.LuceneSearchProvider.search() is applicable for argument types: (com.atlassian.query.QueryImpl, com.atlassian.jira.user.DelegatingApplicationUser...) values: [{project = "EAP"} AND {updated < "2021-08-25"}, mouh(JIRAUSER59200), ...] Possible solutions: search(com.atlassian.jira.issue.search.SearchQuery, com.atlassian.jira.web.bean.PagerFilter), search(com.atlassian.jira.issue.search.SearchQuery, com.atlassian.jira.web.bean.PagerFilter, java.util.Set), search(com.atlassian.jira.issue.search.SearchQuery, org.apache.lucene.search.Collector), each(groovy.lang.Closure) at Script19999.run(Script19999.groovy:60)
修复方案
核心问题
新版本Jira的SearchProvider.search()方法不再支持直接传入Query、ApplicationUser和PagerFilter,需要将Query和用户封装为SearchQuery对象后传入。
具体修改点
- 修正
SearchProvider调用方式:使用SearchQuery.create(query2, user)生成符合要求的参数 - 清理冗余导入:移除重复的类导入,简化代码结构
- 修复未定义变量:删除原代码中未定义的
lastDate、results、admins变量,避免运行报错 - 动态计算1年前日期:替换硬编码日期为动态计算的1年前日期,提升脚本通用性
修改后的完整代码
import com.atlassian.jira.component.ComponentAccessor import org.apache.log4j.Logger import com.atlassian.jira.jql.parser.JqlQueryParser import com.atlassian.jira.web.bean.PagerFilter import com.atlassian.jira.project.Project import com.atlassian.jira.issue.search.SearchProvider import com.atlassian.jira.issue.search.SearchQuery import com.atlassian.jira.user.ApplicationUser def log = Logger.getLogger("atlassian-jira.log") // 获取所有项目 List<Project> prList = ComponentAccessor.getProjectManager().getProjectObjects() def jqlQueryParser = ComponentAccessor.getComponent(JqlQueryParser) def searchProvider = ComponentAccessor.getComponent(SearchProvider) ApplicationUser user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser() // 计算1年前的日期,格式化为JQL支持的yyyy-MM-dd def oneYearAgo = new Date() - 365 def dateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd") def formattedDate = dateFormat.format(oneYearAgo) for(Project myproject : prList) { // 构建JQL查询:当前项目 + 更新时间早于1年前 def query2 = jqlQueryParser.parseQuery("project = ${myproject.getKey()} and updated < '${formattedDate}'") // 用SearchQuery封装查询和用户,调用search方法 def searchQuery = SearchQuery.create(query2, user) def results2 = searchProvider.search(searchQuery, PagerFilter.getUnlimitedFilter()) // 输出日志,包含项目名称、问题数量、项目负责人 log.warn("项目名称: ${myproject.getName()} ||| 超过1年未更新的问题数量: ${results2.total} ||| 项目负责人: ${myproject.getProjectLead()?.displayName ?: '无'}") }
说明
- 脚本会遍历所有Jira项目,输出每个项目中超过1年未更新的问题数量
- 日期计算采用
new Date() - 365,如果需要更精确的"一年前"(比如考虑闰年),可以用Calendar类来计算 - 日志输出到Jira的
atlassian-jira.log文件,可通过Jira日志管理查看
内容的提问来源于stack exchange,提问作者منى
相关产品推荐
相关产品推荐

