前言
最近接到个需求开发Jira插件,陆陆续续还是踩了很多坑,在此记录一下
Jira是比较常用的项目管理工具,由Java编写;Jira插件其实就是一个Jar包,借助于官方提供的SDK,可以很方便的获取各种数据和进行各种操作;但是有一个比较麻烦的是不同版本的Jira SDK的可用API不同,网上资料也较少,需要多看文档和摸索
正文
一. 环境搭建
首先我们需要搭建一个能在本地测试的环境,不然频繁的导出Jar包到线上环境将极大降低效率;这里有一个坑是:Jira SDK对Java版本要求比较严格,当时笔者用的Jira SDK 8.0,Java版本是Java 11,但是始终跑不起来,出现问题如下图;查了比较久,最终将Java版本改到Java 8得以解决;Jira与Java版本对应关系
之后可以按照官方教程写一个Hello World的Demo,先跑起来,熟悉一下开发流程;再推荐一篇中文博客也比较详细
本地访问链接是:http://localhost:2990/jira
其实本地的Jira插件测试环境实际上是跑起来的一个Tomcat;这里记录几个有用的命令:
atlas-run
/atlas-debug
:启动Tomcat,加载插件atlas-mvn package
:热更新,即如果代码有改动,那么可以运行此命令而不必重启Tomcatatlas-clean
:清除缓存,如果运行失败且无他法时,可以尝试用此命令清除一下缓存
二. 定制插件
再编写插件之前,需要先了解一下相关概念,即Jira Function,参见官方文档;一般来说我们定制Jira插件都需要继承自AbstractJqlFunction
这个类,比较重要的有如下几个方法(注意:不同的SDK版本方法参数等可能有差异)
public MessageSet validate(ApplicationUser searcher, FunctionOperand operand, TerminalClause terminalClause)
:该方法再构造函数之后调用,用于进行参数验证,用户访问权限验证等public List<QueryLiteral> getValues(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause)
:该方法用于返回待展示的Item列表,我们的主要工作也在这个方法中public int getMinimumNumberOfExpectedArguments()
:返回接收的最少参数个数
前面也说了,不同版本的Jira SDK的可用API差异较大,这里举一个根据传入参数查询Issue列表的示例:
final ApplicationUser applicationUser = queryCreationContext.getApplicationUser();
final List<String> args = operand.getArgs();
final List<QueryLiteral> queryLiterals = new LinkedList<>();
JqlQueryParser parser = ComponentAccessor.getComponent(JqlQueryParser.class);
try {
Query query = parser.parseQuery(args.get(0));
// private final SearchService searchService;
SearchResults searchResult = searchService.search(applicationUser, query, PagerFilter.getUnlimitedFilter());
List<Issue> issues = searchResult.getIssues();
for (Issue issue : issues) {
queryLiterals.add(new QueryLiteral(operand, issue.getId()));
}
} catch (Exception e) {
log.error("Error search: ", e);
}