专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Java——Java连接Jira,创建、修改、删除工单信息

还不了解Jira是什么的同学可以看一下这篇文章:https://tech.souyunku.com/wgblog-code/p/11750767.html

本篇文章主要介绍如何使用Java操作Jira,包括获取连接,创建、修改、删除工单信息

1、获取Jira连接并执行请求:

/**
     * 执行shell脚本
     *
     * @param command
     * @return
     * @throws IOException
     */
    private static String executeShell(String command) throws IOException {
        StringBuffer result = new StringBuffer();
        Process process = null;
        InputStream is = null;
        BufferedReader br = null;
        String line = null;
        try {
            //windows平台下用cmd发生请求
            if (osname.indexOf("windows") >= 0) {
                process = new ProcessBuilder("cmd.exe", "/c", command).start();
                System.out.println("cmd.exe /c " + command); //安装Cygwin,使windows可以执行linux命令
            } else {
                //linux平台下执行请求
                process = new ProcessBuilder("/bin/sh", "-c", command).start();
                System.out.println("/bin/sh -c " + command);
            }

            is = process.getInputStream();
            br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

            while ((line = br.readLine()) != null) {
                System.out.println(line);
                result.append(line);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            //关闭连接
            br.close();
            process.destroy();
            is.close();
        }

        //返回结果
        return result.toString();
    }

  

2、获取获得工单信息:

/**
     * 活动工单信息
     *
     * @param issueKey
     *            工单key
     * @return
     * @throws IOException
     */
    public static String getIssue(String issueKey) throws IOException {

        /**
         * jira的请求格式:
         * curl -u 用户名:密码 -X 请求类型 --data @文件的路径 -H "Content-Type: application/json" 请求路径
         * 
         * 官方示例:curl -u admin:admin -X POST --data @data.txt -H "Content-Type: application/json" http://localhost:8080/jira/rest/api/2/issue/
         *
         *  注意:--data后面的 @符合一定不能少
         */

        String command = "curl -D- -u " + user + ":" + pwd
                + " -X GET -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/issue/" + issueKey + "\"";

        String issueSt = executeShell(command);

        return issueSt;

    }

  

3、创建工单信息:

/**
     * 创建工单
     *
     * @param projectKey
     *            项目key
     * @param issueType
     *            工单类型 name
     * @param description
     *            工单描述
     * @param summary
     *            工单主题
    //     * @param assignee
     *            工单负责人
     *          
     * @return
     * @throws IOException
     */
    public static String createIssue(String projectKey, String issueType,String user,
                                     String description, String summary) throws IOException {

        String command="curl -D- -u " + user + ":" + pwd
                + " -X POST  --data @E:\\data.json -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/issue/\"";

        String issueSt = executeShell(command);

        if (!issueSt.contains("errorMessages")) {
            System.out.println("success");
        }else {
            System.out.println("error");
        }
        return issueSt;
    }

  

这里创建工单信息的文件我存放在了我电脑E盘根目录下面,名字为data.json

data.json的内容如下

{
    "fields": {
        "summary": "test008", 
        "issuetype": {
            "name": "Task"
        },
        "project": {
            "key": "MIN"
        },
        "description": "测试008",
        "assignee": {
            "name": "jwg"
        }
    }
}

  

1、 summary:工单主题
2、 issuetype:问题类型,问题类型是jira项目中存在的类型
3、 project:工单所属项目,工单所属项目是Jira中已经创建的项目
4、 description:工单描述,一些描述信息
5、 assignee:工单负责人,这个工单的负责人是谁

注意:data.json格式必须为json格式

4、更新工单信息:

/**
     * 更新工单
     *
     * @param issueKey
     *            工单key
     * @param map
     *            工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee",
     *            "{\"name\":\"username\"}"); map.put("summary",
     *            "\"summary00002\"");
     * @return
     * @throws IOException
     */
    public static String editIssue(String issueKey, Map<String, String> map)
            throws IOException {

        StringBuffer fieldsB = new StringBuffer();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            fieldsB.append("\"").append(entry.getKey()).append("\":")
                    .append(entry.getValue()).append(",");
        }
        String fields = fieldsB.toString();
        fields = fields.substring(0, fields.length() - 1);

        String command = "curl -D- -u " + user + ":" + pwd
                + " -X PUT   --data '{\"fields\": { " + fields
                + "}}' -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/issue/" + issueKey + "\"";

        String issueSt = executeShell(command);

        return issueSt;
    }

  

5、查询工单信息:

/**
     * 查询工单
     * @param jql
     * assignee=username
     * assignee=username&startAt=2&maxResults=2
     * assignee=username+order+by+duedate
     * project=projectKey+order+by+duedate&fields=id,key
     * @return
     * @throws IOException
     */
    public static String searchIssues(String jql) throws IOException{
        String command = "curl -D- -u " + user + ":" + pwd
                + " -X GET -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/search?jql=" + jql + "\"";

        String issueSt = executeShell(command);

        return issueSt;
    }

  

6、为工单增加注释:

/**
     * 为工单增加注释说明
     * @param issueKey 工单key

     *
     */
    public static String addComments(String issueKey,String comments) throws IOException{
        String command = "curl -D- -u " + user + ":" + pwd
                + " -X PUT   --data '{\"update\": { \"comment\": [ { \"add\": { \"body\":\""+comments+"\" } } ] }}' -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/issue/" + issueKey + "\"";

        String issueSt = executeShell(command);

        return issueSt;
    }

  

7、删除工单:

/**
     * 删除工单
     * @param issueKey 工单key
     * @return
     * @throws IOException
     */
    public static String deleteIssueByKey(String issueKey) throws IOException{
        String command = "curl -D- -u " + user + ":" + pwd
                + " -X DELETE -H \"Content-Type: application/json\" \"" + uri
                + "/rest/api/2/issue/" + issueKey + "\"";

        String issueSt = executeShell(command);

        return issueSt;
    }

  

8、上传附件:

/**
     * 上传附件
     * @param issueKey 工单key
     * @param filepath 文件路径
     * @return
     * @throws IOException
     */
    public static String addAttachment(String issueKey,String filepath) throws IOException{
        String command = "curl -D- -u " + user + ":" + pwd
                + " -X POST -H \"X-Atlassian-Token: nocheck\"  -F \"file=@"+filepath+"\" \"" + uri
                + "/rest/api/2/issue/" + issueKey + "/attachments\"";

        String issueSt = executeShell(command);

        return issueSt;
    }

  

项目的完整代码如下:

87_1.png 87_2.png

 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.Map;

 /**
  * JIRA REST API 工具类
  * https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials
  * https://docs.atlassian.com/jira/REST/7.0-SNAPSHOT/
  * @author 用代码征服天下
  *
  */
 public class JiraTest {

     public static void main(String[] args) throws IOException {
         // TODO Auto-generated method stub
         //获取工单信息,参数为问题名称
         JiraAPIUtil.getIssue("OAM-5402");

         JiraAPIUtil.createIssue("MIN", "Task", "jwg", "工单描述","工单主题");
 //
 //         Map<String,String> map = new HashMap<String,String>();
 //         map.put("assignee", "{\"name\":\"username\"}");
 //         map.put("summary", "\"summary00002\"");
 //         JiraAPIUtil.editIssue("MIN-1", map);

         JiraAPIUtil.searchIssues("assignee=username");
         System.out.println("*****************************");
         JiraAPIUtil.searchIssues("assignee=username+order+by+duedate");
         System.out.println("*****************************");

         JiraAPIUtil.addComments("MIN-1", "123456哈哈哈哈");
         JiraAPIUtil.deleteIssueByKey("NQCP-38");
         JiraAPIUtil.addAttachment("NQCP-39", "d://myfile01.json");  //linux路径:   /home/boss/myfile.txt
         JiraAPIUtil.addComments("createmeta", "123456哈哈哈哈");
     }

     static String uri = "http://localhost:8080"; //Jira服务器地址
     static String user = "jwg";//Jira用户名
     static String pwd = "jwg123456";//Jira密码
     static String osname = System.getProperty("os.name").toLowerCase(); //获取操作系统名称

     /**
      * 执行shell脚本
      *
      * @param command
      * @return
      * @throws IOException
      */
     private static String executeShell(String command) throws IOException {
         StringBuffer result = new StringBuffer();
         Process process = null;
         InputStream is = null;
         BufferedReader br = null;
         String line = null;
         try {
             //windows平台下用cmd发生请求
             if (osname.indexOf("windows") >= 0) {
                 process = new ProcessBuilder("cmd.exe", "/c", command).start();
                 System.out.println("cmd.exe /c " + command); //安装Cygwin,使windows可以执行linux命令
             } else {
                 //linux平台下执行请求
                 process = new ProcessBuilder("/bin/sh", "-c", command).start();
                 System.out.println("/bin/sh -c " + command);
             }

             is = process.getInputStream();
             br = new BufferedReader(new InputStreamReader(is, "UTF-8"));

             while ((line = br.readLine()) != null) {
                 System.out.println(line);
                 result.append(line);
             }

         } catch (Exception e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } finally {
             //关闭连接
             br.close();
             process.destroy();
             is.close();
         }

         //返回结果
         return result.toString();
     }

     /**
      * 活动工单信息
      *
      * @param issueKey
      *            工单key
      * @return
      * @throws IOException
      */
     public static String getIssue(String issueKey) throws IOException {

         /**
          * jira的请求格式:
          * curl -u 用户名:密码 -X 请求类型 --data @文件的路径 -H "Content-Type: application/json" 请求路径
          *
          * 官方示例:curl -u admin:admin -X POST --data @data.txt -H "Content-Type: application/json" http://localhost:8080/jira/rest/api/2/issue/
          *
          *  注意:--data后面的 @符合一定不能少
          */

         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X GET -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/issue/" + issueKey + "\"";

         String issueSt = executeShell(command);

         return issueSt;

     }

     /**
      * 创建工单
      *
      * @param projectKey
      *            项目key
      * @param issueType
      *            工单类型 name
      * @param description
      *            工单描述
      * @param summary
      *            工单主题
     //     * @param assignee
      *            工单负责人
      *            工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee",
      *            "{\"name\":\"username\"}"); map.put("summary",
      *            "\"summary00002\"");
      * @return
      * @throws IOException
      */
     public static String createIssue(String projectKey, String issueType,String user,
                                      String description, String summary) throws IOException {

         String command="curl -D- -u " + user + ":" + pwd
                 + " -X POST  --data @E:\\data.json -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/issue/\"";

         String issueSt = executeShell(command);

         if (!issueSt.contains("errorMessages")) {
             System.out.println("success");
         }else {
             System.out.println("error");
         }
         return issueSt;
     }

     /**
      * 更新工单
      *
      * @param issueKey
      *            工单key
      * @param map
      *            工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee",
      *            "{\"name\":\"username\"}"); map.put("summary",
      *            "\"summary00002\"");
      * @return
      * @throws IOException
      */
     public static String editIssue(String issueKey, Map<String, String> map)
             throws IOException {

         StringBuffer fieldsB = new StringBuffer();
         for (Map.Entry<String, String> entry : map.entrySet()) {
             fieldsB.append("\"").append(entry.getKey()).append("\":")
                     .append(entry.getValue()).append(",");
         }
         String fields = fieldsB.toString();
         fields = fields.substring(0, fields.length() - 1);

         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X PUT   --data '{\"fields\": { " + fields
                 + "}}' -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/issue/" + issueKey + "\"";

         String issueSt = executeShell(command);

         return issueSt;
     }

     /**
      * 查询工单
      * @param jql
      * assignee=username
      * assignee=username&startAt=2&maxResults=2
      * assignee=username+order+by+duedate
      * project=projectKey+order+by+duedate&fields=id,key
      * @return
      * @throws IOException
      */
     public static String searchIssues(String jql) throws IOException{
         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X GET -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/search?jql=" + jql + "\"";

         String issueSt = executeShell(command);

         return issueSt;
     }

     /**
      * 为工单增加注释说明
      * @param issueKey 工单key

      *
      */
     public static String addComments(String issueKey,String comments) throws IOException{
         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X PUT   --data '{\"update\": { \"comment\": [ { \"add\": { \"body\":\""+comments+"\" } } ] }}' -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/issue/" + issueKey + "\"";

         String issueSt = executeShell(command);

         return issueSt;
     }

     /**
      * 删除工单
      * @param issueKey 工单key
      * @return
      * @throws IOException
      */
     public static String deleteIssueByKey(String issueKey) throws IOException{
         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X DELETE -H \"Content-Type: application/json\" \"" + uri
                 + "/rest/api/2/issue/" + issueKey + "\"";

         String issueSt = executeShell(command);

         return issueSt;
     }

     /**
      * 上传附件
      * @param issueKey 工单key
      * @param filepath 文件路径
      * @return
      * @throws IOException
      */
     public static String addAttachment(String issueKey,String filepath) throws IOException{
         String command = "curl -D- -u " + user + ":" + pwd
                 + " -X POST -H \"X-Atlassian-Token: nocheck\"  -F \"file=@"+filepath+"\" \"" + uri
                 + "/rest/api/2/issue/" + issueKey + "/attachments\"";

         String issueSt = executeShell(command);

         return issueSt;
     }

 }

Jira完整代码

文章永久链接:https://tech.souyunku.com/36187

未经允许不得转载:搜云库技术团队 » Java——Java连接Jira,创建、修改、删除工单信息

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们