还不了解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"
}
}
}

  

  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;
}

  

项目的完整代码如下:

 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完整代码

最新文章

  1. 在渲染前获取 View 的宽高
  2. TomTom (16Q3)数据协议基础
  3. VMware安装的相关文章
  4. Codeforces Round #127 (Div. 2)
  5. Auto Updating the exe from a network location when application starts z
  6. Castle 开发系列文章
  7. Java中Integer的最大值和最小值
  8. WordPress 主题开发 - (五)WordPress 主题模板及目录结构 待翻译
  9. PAIP.提升效率----论项目知识库的建设。。
  10. rsyslog 日志服务器接收日志权限问题
  11. Raid1源代码分析--Barrier机制
  12. 原生态纯JavaScript 100大技巧大收集---你值得拥有
  13. 带着萌新看springboot源码
  14. No bean named &#39;dataSource&#39; is defined
  15. 算法(第四版)C# 习题题解——1.3
  16. mac 下利用AndroidStudio APK获取签名信息
  17. Selenium上机实验
  18. Android Studio 点击两次返回键,退出APP
  19. Python 2、8、10、16进制间的转换
  20. laravel 事务处理

热门文章

  1. git撤销远程commit
  2. 设置xml以让通知spring 扫描 注解
  3. 令人迷惑的Gamma
  4. GeoGebra的一些指令名字
  5. E. 蚂蚁和斐波那契
  6. react: typescript custom hooks useAsyncTable
  7. Java IO 流--FileUtils 工具类封装
  8. java算法-二分法查找实现
  9. Apache Hudi集成Apache Zeppelin实战
  10. 列表按钮功能的设置和DOM的使用