[本文出自天外歸雲的博客園]
前提
1、需要安裝maven環境;
2、在本地創建maven項目並修改maven配置文件“pom.xml”,添加如下內容:
<dependency> <groupId>com.atlassian.jira</groupId> <artifactId>jira-rest-java-client</artifactId> <version>0.5-m6</version> </dependency> <dependency> <groupId>com.atlassian.util.concurrent</groupId> <artifactId>atlassian-util-concurrent</artifactId> <version>3.0.0</version> </dependency> <!-- https://mvnrepository.com/artifact/org.sharegov/mjson --> <dependency> <groupId>org.sharegov</groupId> <artifactId>mjson</artifactId> <version>1.4.1</version> </dependency>
以上三個依賴中,前兩個是用來和jira進行交互的類庫,最后一個是可以讓我能夠像在python中處理json一樣處理json的mjson類庫。
封裝方法
對JIRA的操作進行簡單封裝,示例如下:

package com.mockCommon.util; import java.net.URI; import java.net.URISyntaxException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.joda.time.DateTime; import com.atlassian.jira.rest.client.JiraRestClient; import com.atlassian.jira.rest.client.NullProgressMonitor; import com.atlassian.jira.rest.client.domain.BasicComponent; import com.atlassian.jira.rest.client.domain.Comment; import com.atlassian.jira.rest.client.domain.Issue; import com.atlassian.jira.rest.client.internal.jersey.JerseyJiraRestClientFactory; import com.mockCommon.model.JiraInfoModel; import mjson.Json; public class JiraUtil { /** * 登錄JIRA並返回指定的JiraRestClient對象 * * @param username * @param password * @return * @throws URISyntaxException */ public static JiraRestClient login_jira(String username, String password) throws URISyntaxException { try { final JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory(); final URI jiraServerUri = new URI("http://jira.ms.netease.com"); final JiraRestClient restClient = factory.createWithBasicHttpAuthentication(jiraServerUri, username, password); return restClient; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取並返回指定的Issue對象 * * @param issueNum * @param username * @param password * @return * @throws URISyntaxException */ public static Issue get_issue(String issueNum, String username, String password) throws URISyntaxException { try { final JiraRestClient restClient = login_jira(username, password); final NullProgressMonitor pm = new NullProgressMonitor(); final Issue issue = restClient.getIssueClient().getIssue(issueNum, pm); return issue; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA備注部分的內容 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static List<String> get_comments_body(Issue issue) throws URISyntaxException { try { List<String> comments = new ArrayList<String>(); for (Comment comment : issue.getComments()) { comments.add(comment.getBody().toString()); } return comments; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的創建時間 * * @param issueNum * @param username * @param password * @return * @throws URISyntaxException */ public static DateTime get_create_time(Issue issue) throws URISyntaxException { try { return issue.getCreationDate(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的描述部分 * * @param issueNum * @param username * @param password * @return * @throws URISyntaxException */ public static String get_description(Issue issue) throws URISyntaxException { try { return issue.getDescription(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的標題 * * @param issueNum * @param username * @param password * @return * @throws URISyntaxException */ public static String get_summary(Issue issue) throws URISyntaxException { try { return issue.getSummary(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的報告人的名字 * * @param issueNum * @param username * @param password * @return * @throws URISyntaxException */ public static String get_reporter(Issue issue) throws URISyntaxException { try { return issue.getReporter().getDisplayName(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的分派人的姓名列表 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static ArrayList<String> get_assignees(Issue issue) throws URISyntaxException { try { Json json = Json.read(issue.getFieldByName("分派給").getValue().toString()); Iterator<Json> assignees = json.asJsonList().iterator(); ArrayList<String> assigneesNames = new ArrayList<String>(); while (assignees.hasNext()) { Json assignee = Json.read(assignees.next().toString()); String assigneeName = assignee.at("displayName").toString(); assigneesNames.add(assigneeName); } return assigneesNames; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的狀態 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static String get_status(Issue issue) throws URISyntaxException { try { return issue.getStatus().getName(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的類型 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static String get_issue_type(Issue issue) throws URISyntaxException { try { return issue.getIssueType().getName(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的模塊 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static ArrayList<String> get_modules(Issue issue) throws URISyntaxException { try { ArrayList<String> arrayList = new ArrayList<String>(); Iterator<BasicComponent> basicComponents = issue.getComponents().iterator(); while (basicComponents.hasNext()) { String moduleName = basicComponents.next().getName(); arrayList.add(moduleName); } return arrayList; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的前端人員的姓名列表 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static ArrayList<String> get_qianduans(Issue issue) throws URISyntaxException { try { ArrayList<String> qianduanList = new ArrayList<String>(); Json json = Json.read(issue.getFieldByName("前端").getValue().toString()); Iterator<Json> qianduans = json.asJsonList().iterator(); while (qianduans.hasNext()) { Json qianduan = Json.read(qianduans.next().toString()); String qianduanName = qianduan.at("displayName").toString(); qianduanList.add(qianduanName); } return qianduanList; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的開發的姓名列表 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static ArrayList<String> get_developers(Issue issue) throws URISyntaxException { try { ArrayList<String> developersList = new ArrayList<String>(); Json json = Json.read(issue.getFieldByName("開發").getValue().toString()); Iterator<Json> developers = json.asJsonList().iterator(); while (developers.hasNext()) { Json developer = Json.read(developers.next().toString()); String developerName = developer.at("displayName").toString(); developersList.add(developerName); } return developersList; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的產品人員的姓名 * * @param issue * @param username * @param password * @return * @throws URISyntaxException */ public static String get_product(Issue issue) throws URISyntaxException { try { String product_field = issue.getFieldByName("產品人員").getValue().toString(); return Json.read(product_field).at("displayName").toString(); } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的UE開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_UE_start_time(Issue issue) throws URISyntaxException { try { String UE_start_time = issue.getFieldByName("UE開始時間").getValue().toString(); return UE_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的UE結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_UE_end_time(Issue issue) throws URISyntaxException { try { String UE_end_time = issue.getFieldByName("UE結束時間").getValue().toString(); return UE_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的UI開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_UI_start_time(Issue issue) throws URISyntaxException { try { String UI_start_time = issue.getFieldByName("UI開始時間").getValue().toString(); return UI_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的UI結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_UI_end_time(Issue issue) throws URISyntaxException { try { String UI_end_time = issue.getFieldByName("UI結束時間").getValue().toString(); return UI_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的客戶端開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_app_start_time(Issue issue) throws URISyntaxException { try { String app_start_time = issue.getFieldByName("客戶端開始時間").getValue().toString(); return app_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的客戶端結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_app_end_time(Issue issue) throws URISyntaxException { try { String app_end_time = issue.getFieldByName("客戶端結束時間").getValue().toString(); return app_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的前端開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_qianduan_start_time(Issue issue) throws URISyntaxException { try { String qianduan_start_time = issue.getFieldByName("前端開始時間").getValue().toString(); return qianduan_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的前端結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_qianduan_end_time(Issue issue) throws URISyntaxException { try { String qianduan_end_time = issue.getFieldByName("前端結束時間").getValue().toString(); return qianduan_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的開發開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_develop_start_time(Issue issue) throws URISyntaxException { try { String develop_start_time = issue.getFieldByName("開發開始時間").getValue().toString(); return develop_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的開發結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_develop_end_time(Issue issue) throws URISyntaxException { try { String develop_end_time = issue.getFieldByName("開發結束時間").getValue().toString(); return develop_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的聯調開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_liantiao_start_time(Issue issue) throws URISyntaxException { try { String liantiao_start_time = issue.getFieldByName("聯調開始時間").getValue().toString(); return liantiao_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的聯調結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_liantiao_end_time(Issue issue) throws URISyntaxException { try { String liantiao_end_time = issue.getFieldByName("聯調結束時間").getValue().toString(); return liantiao_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的測試開始時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_test_start_time(Issue issue) throws URISyntaxException { try { String test_start_time = issue.getFieldByName("測試開始時間").getValue().toString(); return test_start_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取指定JIRA的測試結束時間 * * @param issue * @return * @throws URISyntaxException */ public static String get_test_end_time(Issue issue) throws URISyntaxException { try { String test_end_time = issue.getFieldByName("測試結束時間").getValue().toString(); return test_end_time; } catch (Exception e) { e.printStackTrace(); } return null; } /** * 獲取所有可以收集到的JIRA信息並返回JiraInfoModel類型對象 * @param issue * @return * @throws URISyntaxException */ public static JiraInfoModel get_jira_info(Issue issue) throws URISyntaxException { List<String> jiraCommentsBody = get_comments_body(issue); DateTime jiraCreateTime = get_create_time(issue); String description = get_description(issue); String summary = get_summary(issue); String reporter = get_reporter(issue); ArrayList<String> assignees = get_assignees(issue); String status = get_status(issue); String issueType = get_issue_type(issue); ArrayList<String> modules = get_modules(issue); ArrayList<String> qianduans = get_qianduans(issue); ArrayList<String> developers = get_developers(issue); String product = get_product(issue); String UE_start_time = get_UE_start_time(issue); String UE_end_time = get_UE_end_time(issue); String UI_start_time = get_UI_start_time(issue); String UI_end_time = get_UI_end_time(issue); String app_start_time = get_app_start_time(issue); String app_end_time = get_app_end_time(issue); String qianduan_start_time = get_qianduan_start_time(issue); String qianduan_end_time = get_qianduan_end_time(issue); String develop_start_time = get_develop_start_time(issue); String develop_end_time = get_develop_end_time(issue); String liantiao_start_time = get_liantiao_start_time(issue); String liantiao_end_time = get_liantiao_end_time(issue); String test_start_time = get_test_start_time(issue); String test_end_time = get_test_end_time(issue); JiraInfoModel jiraInfoModel = new JiraInfoModel(); jiraInfoModel.setJiraCommentsBody(jiraCommentsBody); jiraInfoModel.setJiraCreateTime(jiraCreateTime); jiraInfoModel.setDescription(description); jiraInfoModel.setSummary(summary); jiraInfoModel.setReporter(reporter); jiraInfoModel.setAssignees(assignees); jiraInfoModel.setStatus(status); jiraInfoModel.setIssueType(issueType); jiraInfoModel.setModules(modules); jiraInfoModel.setQianduans(qianduans); jiraInfoModel.setDevelopers(developers); jiraInfoModel.setProduct(product); jiraInfoModel.setUE_start_time(UE_start_time); jiraInfoModel.setUE_end_time(UE_end_time); jiraInfoModel.setUI_start_time(UI_start_time); jiraInfoModel.setUI_end_time(UI_end_time); jiraInfoModel.setApp_start_time(app_start_time); jiraInfoModel.setApp_end_time(app_end_time); jiraInfoModel.setQianduan_start_time(qianduan_start_time); jiraInfoModel.setQianduan_end_time(qianduan_end_time); jiraInfoModel.setDevelop_start_time(develop_start_time); jiraInfoModel.setDevelop_end_time(develop_end_time); jiraInfoModel.setLiantiao_start_time(liantiao_start_time); jiraInfoModel.setLiantiao_end_time(liantiao_end_time); jiraInfoModel.setTest_start_time(test_start_time); jiraInfoModel.setTest_end_time(test_end_time); return jiraInfoModel; } /** * 測試函數 * * @param args * @throws URISyntaxException */ public static void main(String[] args) throws URISyntaxException { String username = "用戶名"; String password = "密碼"; String issueNum = "JIRA號"; final Issue issue = get_issue(issueNum, username, password); JiraInfoModel jiraInfoModel = get_jira_info(issue); System.out.println(jiraInfoModel.getSummary()); } }
對應需要創建model類,JiraInfoModel類,包含所有收集到的數據:

package com.mockCommon.model; import java.util.ArrayList; import java.util.List; import org.joda.time.DateTime; public class JiraInfoModel { List<String> jiraCommentsBody; DateTime jiraCreateTime; String description; String summary; String reporter; ArrayList<String> assignees; String status; String issueType; ArrayList<String> modules; ArrayList<String> qianduans; ArrayList<String> developers; String product; String start_develop_time; String UE_start_time; String UE_end_time; String UI_start_time; String UI_end_time; String app_start_time; String app_end_time; String qianduan_start_time; String qianduan_end_time; String develop_start_time; String develop_end_time; String liantiao_start_time; String liantiao_end_time; String test_start_time; String test_end_time; public List<String> getJiraCommentsBody() { return jiraCommentsBody; } public void setJiraCommentsBody(List<String> jiraCommentsBody) { this.jiraCommentsBody = jiraCommentsBody; } public DateTime getJiraCreateTime() { return jiraCreateTime; } public void setJiraCreateTime(DateTime jiraCreateTime) { this.jiraCreateTime = jiraCreateTime; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public String getReporter() { return reporter; } public void setReporter(String reporter) { this.reporter = reporter; } public ArrayList<String> getAssignees() { return assignees; } public void setAssignees(ArrayList<String> assignees) { this.assignees = assignees; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getIssueType() { return issueType; } public void setIssueType(String issueType) { this.issueType = issueType; } public ArrayList<String> getModules() { return modules; } public void setModules(ArrayList<String> modules) { this.modules = modules; } public ArrayList<String> getQianduans() { return qianduans; } public void setQianduans(ArrayList<String> qianduans) { this.qianduans = qianduans; } public ArrayList<String> getDevelopers() { return developers; } public void setDevelopers(ArrayList<String> developers) { this.developers = developers; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getStart_develop_time() { return start_develop_time; } public void setStart_develop_time(String start_develop_time) { this.start_develop_time = start_develop_time; } public String getUE_start_time() { return UE_start_time; } public void setUE_start_time(String uE_start_time) { UE_start_time = uE_start_time; } public String getUE_end_time() { return UE_end_time; } public void setUE_end_time(String uE_end_time) { UE_end_time = uE_end_time; } public String getUI_start_time() { return UI_start_time; } public void setUI_start_time(String uI_start_time) { UI_start_time = uI_start_time; } public String getUI_end_time() { return UI_end_time; } public void setUI_end_time(String uI_end_time) { UI_end_time = uI_end_time; } public String getApp_start_time() { return app_start_time; } public void setApp_start_time(String app_start_time) { this.app_start_time = app_start_time; } public String getApp_end_time() { return app_end_time; } public void setApp_end_time(String app_end_time) { this.app_end_time = app_end_time; } public String getQianduan_start_time() { return qianduan_start_time; } public void setQianduan_start_time(String qianduan_start_time) { this.qianduan_start_time = qianduan_start_time; } public String getQianduan_end_time() { return qianduan_end_time; } public void setQianduan_end_time(String qianduan_end_time) { this.qianduan_end_time = qianduan_end_time; } public String getDevelop_start_time() { return develop_start_time; } public void setDevelop_start_time(String develop_start_time) { this.develop_start_time = develop_start_time; } public String getDevelop_end_time() { return develop_end_time; } public void setDevelop_end_time(String develop_end_time) { this.develop_end_time = develop_end_time; } public String getLiantiao_start_time() { return liantiao_start_time; } public void setLiantiao_start_time(String liantiao_start_time) { this.liantiao_start_time = liantiao_start_time; } public String getLiantiao_end_time() { return liantiao_end_time; } public void setLiantiao_end_time(String liantiao_end_time) { this.liantiao_end_time = liantiao_end_time; } public String getTest_start_time() { return test_start_time; } public void setTest_start_time(String test_start_time) { this.test_start_time = test_start_time; } public String getTest_end_time() { return test_end_time; } public void setTest_end_time(String test_end_time) { this.test_end_time = test_end_time; } }
以上代碼中在get_assignees()方法部分用到了mjson中的Json對象,也是主要用來處理json格式的對象。
代碼中“用戶名”、“密碼”、“JIRA號”部分為需要替換的部分。
另外,對於通過jql查詢的封裝如下:
/** * 通過jql語句進行查詢並返回一個包含issue的key的數組 * * @param username 登錄JIRA的用戶名 * @param password 登錄JIRA的用戶密碼 * @param current_user_name 要查詢的用戶名 * @param jql * @return * @throws URISyntaxException */ public static ArrayList<String> search_jql(String username, String password, String current_user_name, String jql) throws URISyntaxException { final JiraRestClient restClient = login_jira(username, password); final NullProgressMonitor pm = new NullProgressMonitor(); SearchResult searchResult = restClient.getSearchClient().searchJql(jql, pm); Iterator<BasicIssue> basicIssues = searchResult.getIssues().iterator(); ArrayList<String> issueKeys = new ArrayList<>(); while (basicIssues.hasNext()) { String issueKey = basicIssues.next().getKey(); System.out.println(issueKey); issueKeys.add(issueKey); } return issueKeys; }
上面這些是基本的例子,后續我又針對實際應用做了很多修改。基於這些封裝,再用上Spring MVC框架,我做了一個基於JIRA開發的質量保障平台。
Github地址:https://github.com/OuterCloud/JiraHelper
例圖1:
例圖2: