Jira插件开发总结

Jira Plugin

Posted by 袁平 on February 14, 2019

前言

最近接到个需求开发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;这里记录几个有用的命令:

  1. atlas-run/atlas-debug:启动Tomcat,加载插件
  2. atlas-mvn package:热更新,即如果代码有改动,那么可以运行此命令而不必重启Tomcat
  3. atlas-clean:清除缓存,如果运行失败且无他法时,可以尝试用此命令清除一下缓存

二. 定制插件

再编写插件之前,需要先了解一下相关概念,即Jira Function,参见官方文档;一般来说我们定制Jira插件都需要继承自AbstractJqlFunction这个类,比较重要的有如下几个方法(注意:不同的SDK版本方法参数等可能有差异)

  1. public MessageSet validate(ApplicationUser searcher, FunctionOperand operand, TerminalClause terminalClause):该方法再构造函数之后调用,用于进行参数验证,用户访问权限验证等
  2. public List<QueryLiteral> getValues(QueryCreationContext queryCreationContext, FunctionOperand operand, TerminalClause terminalClause):该方法用于返回待展示的Item列表,我们的主要工作也在这个方法中
  3. 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);
	 }

三. 参考链接

  1. Jira插件Demo
  2. Jira插件Demo
  3. Jira插件Demo
  4. Jira插件Demo
  5. Jira SDK API