还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.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"
        }
    }
}

  

注意: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;
    }

  

项目的完整代码如下:

  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStream;
  4 import java.io.InputStreamReader;
  5 import java.util.Map;
  6
  7 /**
  8  * JIRA REST API 工具类
  9  * https://developer.atlassian.com/jiradev/jira-apis/jira-rest-apis/jira-rest-api-tutorials
 10  * https://docs.atlassian.com/jira/REST/7.0-SNAPSHOT/
 11  * @author 用代码征服天下
 12  *
 13  */
 14 public class JiraTest {
 15
 16     public static void main(String[] args) throws IOException {
 17         // TODO Auto-generated method stub
 18         //获取工单信息,参数为问题名称
 19         JiraAPIUtil.getIssue("OAM-5402");
 20
 21         JiraAPIUtil.createIssue("MIN", "Task", "jwg", "工单描述","工单主题");
 22 //
 23 //         Map<String,String> map = new HashMap<String,String>();
 24 //         map.put("assignee", "{\"name\":\"username\"}");
 25 //         map.put("summary", "\"summary00002\"");
 26 //         JiraAPIUtil.editIssue("MIN-1", map);
 27
 28         JiraAPIUtil.searchIssues("assignee=username");
 29         System.out.println("*****************************");
 30         JiraAPIUtil.searchIssues("assignee=username+order+by+duedate");
 31         System.out.println("*****************************");
 32
 33         JiraAPIUtil.addComments("MIN-1", "123456哈哈哈哈");
 34         JiraAPIUtil.deleteIssueByKey("NQCP-38");
 35         JiraAPIUtil.addAttachment("NQCP-39", "d://myfile01.json");  //linux路径:   /home/boss/myfile.txt
 36         JiraAPIUtil.addComments("createmeta", "123456哈哈哈哈");
 37     }
 38
 39     static String uri = "http://localhost:8080"; //Jira服务器地址
 40     static String user = "jwg";//Jira用户名
 41     static String pwd = "jwg123456";//Jira密码
 42     static String osname = System.getProperty("os.name").toLowerCase(); //获取操作系统名称
 43
 44     /**
 45      * 执行shell脚本
 46      *
 47      * @param command
 48      * @return
 49      * @throws IOException
 50      */
 51     private static String executeShell(String command) throws IOException {
 52         StringBuffer result = new StringBuffer();
 53         Process process = null;
 54         InputStream is = null;
 55         BufferedReader br = null;
 56         String line = null;
 57         try {
 58             //windows平台下用cmd发生请求
 59             if (osname.indexOf("windows") >= 0) {
 60                 process = new ProcessBuilder("cmd.exe", "/c", command).start();
 61                 System.out.println("cmd.exe /c " + command); //安装Cygwin,使windows可以执行linux命令
 62             } else {
 63                 //linux平台下执行请求
 64                 process = new ProcessBuilder("/bin/sh", "-c", command).start();
 65                 System.out.println("/bin/sh -c " + command);
 66             }
 67
 68             is = process.getInputStream();
 69             br = new BufferedReader(new InputStreamReader(is, "UTF-8"));
 70
 71             while ((line = br.readLine()) != null) {
 72                 System.out.println(line);
 73                 result.append(line);
 74             }
 75
 76         } catch (Exception e) {
 77             // TODO Auto-generated catch block
 78             e.printStackTrace();
 79         } finally {
 80             //关闭连接
 81             br.close();
 82             process.destroy();
 83             is.close();
 84         }
 85
 86         //返回结果
 87         return result.toString();
 88     }
 89
 90     /**
 91      * 活动工单信息
 92      *
 93      * @param issueKey
 94      *            工单key
 95      * @return
 96      * @throws IOException
 97      */
 98     public static String getIssue(String issueKey) throws IOException {
 99
100         /**
101          * jira的请求格式:
102          * curl -u 用户名:密码 -X 请求类型 --data @文件的路径 -H "Content-Type: application/json" 请求路径
103          *
104          * 官方示例:curl -u admin:admin -X POST --data @data.txt -H "Content-Type: application/json" http://localhost:8080/jira/rest/api/2/issue/
105          *
106          *  注意:--data后面的 @符合一定不能少
107          */
108
109         String command = "curl -D- -u " + user + ":" + pwd
110                 + " -X GET -H \"Content-Type: application/json\" \"" + uri
111                 + "/rest/api/2/issue/" + issueKey + "\"";
112
113         String issueSt = executeShell(command);
114
115         return issueSt;
116
117     }
118
119     /**
120      * 创建工单
121      *
122      * @param projectKey
123      *            项目key
124      * @param issueType
125      *            工单类型 name
126      * @param description
127      *            工单描述
128      * @param summary
129      *            工单主题
130     //     * @param assignee
131      *            工单负责人
132      *            工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee",
133      *            "{\"name\":\"username\"}"); map.put("summary",
134      *            "\"summary00002\"");
135      * @return
136      * @throws IOException
137      */
138     public static String createIssue(String projectKey, String issueType,String user,
139                                      String description, String summary) throws IOException {
140
141         String command="curl -D- -u " + user + ":" + pwd
142                 + " -X POST  --data @E:\\data.json -H \"Content-Type: application/json\" \"" + uri
143                 + "/rest/api/2/issue/\"";
144
145         String issueSt = executeShell(command);
146
147         if (!issueSt.contains("errorMessages")) {
148             System.out.println("success");
149         }else {
150             System.out.println("error");
151         }
152         return issueSt;
153     }
154
155
156
157
158
159
160     /**
161      * 更新工单
162      *
163      * @param issueKey
164      *            工单key
165      * @param map
166      *            工单参数map,key为参数名称,value为参数值,参数值必须自带双引号 比如: map.put("assignee",
167      *            "{\"name\":\"username\"}"); map.put("summary",
168      *            "\"summary00002\"");
169      * @return
170      * @throws IOException
171      */
172     public static String editIssue(String issueKey, Map<String, String> map)
173             throws IOException {
174
175         StringBuffer fieldsB = new StringBuffer();
176         for (Map.Entry<String, String> entry : map.entrySet()) {
177             fieldsB.append("\"").append(entry.getKey()).append("\":")
178                     .append(entry.getValue()).append(",");
179         }
180         String fields = fieldsB.toString();
181         fields = fields.substring(0, fields.length() - 1);
182
183         String command = "curl -D- -u " + user + ":" + pwd
184                 + " -X PUT   --data '{\"fields\": { " + fields
185                 + "}}' -H \"Content-Type: application/json\" \"" + uri
186                 + "/rest/api/2/issue/" + issueKey + "\"";
187
188         String issueSt = executeShell(command);
189
190         return issueSt;
191     }
192
193
194
195     /**
196      * 查询工单
197      * @param jql
198      * assignee=username
199      * assignee=username&startAt=2&maxResults=2
200      * assignee=username+order+by+duedate
201      * project=projectKey+order+by+duedate&fields=id,key
202      * @return
203      * @throws IOException
204      */
205     public static String searchIssues(String jql) throws IOException{
206         String command = "curl -D- -u " + user + ":" + pwd
207                 + " -X GET -H \"Content-Type: application/json\" \"" + uri
208                 + "/rest/api/2/search?jql=" + jql + "\"";
209
210         String issueSt = executeShell(command);
211
212         return issueSt;
213     }
214
215
216     /**
217      * 为工单增加注释说明
218      * @param issueKey 工单key
219
220      *
221      */
222     public static String addComments(String issueKey,String comments) throws IOException{
223         String command = "curl -D- -u " + user + ":" + pwd
224                 + " -X PUT   --data '{\"update\": { \"comment\": [ { \"add\": { \"body\":\""+comments+"\" } } ] }}' -H \"Content-Type: application/json\" \"" + uri
225                 + "/rest/api/2/issue/" + issueKey + "\"";
226
227         String issueSt = executeShell(command);
228
229         return issueSt;
230     }
231
232
233     /**
234      * 删除工单
235      * @param issueKey 工单key
236      * @return
237      * @throws IOException
238      */
239     public static String deleteIssueByKey(String issueKey) throws IOException{
240         String command = "curl -D- -u " + user + ":" + pwd
241                 + " -X DELETE -H \"Content-Type: application/json\" \"" + uri
242                 + "/rest/api/2/issue/" + issueKey + "\"";
243
244         String issueSt = executeShell(command);
245
246         return issueSt;
247     }
248
249
250     /**
251      * 上传附件
252      * @param issueKey 工单key
253      * @param filepath 文件路径
254      * @return
255      * @throws IOException
256      */
257     public static String addAttachment(String issueKey,String filepath) throws IOException{
258         String command = "curl -D- -u " + user + ":" + pwd
259                 + " -X POST -H \"X-Atlassian-Token: nocheck\"  -F \"file=@"+filepath+"\" \"" + uri
260                 + "/rest/api/2/issue/" + issueKey + "/attachments\"";
261
262         String issueSt = executeShell(command);
263
264         return issueSt;
265     }
266
267 }
Jira完整代码
12-28 01:08