开发者社区> 天外归云> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JIRA REST java client API实际应用

简介: [本文出自天外归云的博客园] 前提 1、需要安装maven环境; 2、在本地创建maven项目并修改maven配置文件“pom.xml”,添加如下内容: com.atlassian.
+关注继续查看

[本文出自天外归云的博客园]

前提

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

}
View Code

对应需要创建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;
    }
}
View Code

以上代码中在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:

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java交互界面实现计算器开发设计【附函数源码】
使用Java开发的简易计算器,包括加、减、乘、除、平方、立方、小数等运算,适合学习GUI编程实践,
38 0
如何用Java实现位图转矢量图?
通过前面几篇图片转字符、灰度图的文章介绍之后,接下来我们再来看一个有意思的东西,基于前文的基础,实现位图转矢量图的功能
462 0
Java实现GIF图转字符动图实例demo
上一篇文章介绍了静态图转字符的实现demo;接下来也该是动态图转字符的demo了 从前面几篇文章的学习过程中,要想实现这个功能就属于信手拈来了 单张图转字符完成之后,动图无非是每一张静态图都转一遍,保存最后的结果即可 这里我们就不介绍基础的JDK写法了(感兴趣的可以到前面几篇文章中获取),我们直接进入进阶的玩法 接下来我们借助开源项目 github.com/liuyueyi/qu… 来迅速的实现输出Gif字符图
79 0
Java实现图片转字符输出示例demo
前面几篇博文介绍了使用jdk来对图片做一些有意思的转换,接下来我们再介绍一个有意思的玩法,直接根据图片,输出一个二维字符数组,实现用字符来实现绘画的场景 各位小伙伴可能都有看到过一些有趣的注释,比如大佛,美女之类的,通关本文,相信你也很可以很简单的实现类似的场景 作者:一灰灰 链接:https://juejin.cn/post/7033040253673799711 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
48 0
Java实现Gif图转字符动图
前面介绍了两篇基于jdk实现图片灰度处理、转字符图片的操作,接下来我们在将之前的能力扩展一下,支持将一个gif图灰度化或者转gif字符图 本文的实现主要在前面两篇文章的基础上来实现,推荐没有看过的小伙伴也可以瞅一眼
52 0
java后端实现token自动续期,这方案有点优雅
在前后端分离的开发模式下,前端用户登录成功后后端服务会给用户颁发一个token。前端(如vue)在接收到 token后会将token存储到LocalStorage中。
1373 0
SpringBoot整合Java Mail实现Outlook / Office365发送邮件
日常开发过程中,我们经常需要使用到邮件发送任务,比方说验证码的发送、日常信息的通知等。日常比较常用的邮件发送方包括:163、QQ等,本文主要讲解Outlook SMTP的开启方式、OutLook STARTTTL的配置、如何通过JavaMail来实现电子邮件的发送等。
3018 0
Java NIO三件套之Buffer实现原理解析
目前很多高性能的Java RPC框架都是基于Netty实现的,而Netty的设计原理又离不开Java NIO。本篇笔记是对NIO核心三件套:缓冲区(Buffer)、选择器 (Selector)和通道(Channel),其中之一的缓冲区Buffer实现原理的学习总结
71 0
在Java中实现完整的单例模式
个人认为单例模式是设计模式中最简单也是最常用的一种,是对有限资源合理利用的一种方式。这个模式看似简单,但是其中蕴含了关于并发、类加载、序列化等一系列深层次的知识,如果理解不够深,就有可能在高并发时遇到难以预期的异常,或者会造成资源浪费。
48 0
+关注
天外归云
测试开发工程师,目前就职于网易。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Security & Governance using Apache Ranger & Apache Atlas
立即下载
Data-Driven Water Security with Bluemix Apache Spark Service
立即下载
Spring Cloud Alibaba - 重新定义 Java Cloud-Native
立即下载