JIRA REST java client API实际应用
[本文出自天外归云的博客园]
前提
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:

JIRA REST java client API实际应用的更多相关文章
- JIRA Rest JAVA Client API实现问题管理及自定义字段(原创)
JIRA是一个缺陷跟踪管理系统,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时,可以调用他的API. JIRA本身的A ...
- Memcached Java Client API详解
针对Memcached官方网站提供的java_memcached-release_2.0.1版本进行阅读分析,Memcached Java客户端lib库主要提供的调用类是SockIOPool和MemC ...
- ES系列十五、ES常用Java Client API
一.简介 1.先看ES的架构图 二.ES支持的客户端连接方式 1.REST API http请求,例如,浏览器请求get方法:利用Postman等工具发起REST请求:java 发起httpClien ...
- Java 9 揭秘(14. HTTP/2 Client API)
Tips 做一个终身学习的人. 在此章中,主要介绍以下内容: 什么是HTTP/2 Client API 如何创建HTTP客户端 如何使HTTP请求 如何接收HTTP响应 如何创建WebSocket的e ...
- Elasticsearch Java Rest Client API 整理总结 (一)——Document API
目录 引言 概述 High REST Client 起步 兼容性 Java Doc 地址 Maven 配置 依赖 初始化 文档 API Index API GET API Exists API Del ...
- Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
目录 引言 Search APIs Search API Search Request 可选参数 使用 SearchSourceBuilder 构建查询条件 指定排序 高亮请求 聚合请求 建议请求 R ...
- Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...
- JAVA HDFS API Client 连接HA
如果Hadoop开启HA,那么用Java Client连接Hive的时候,需要指定一些额外的参数 package cn.itacst.hadoop.hdfs; import java.io.FileI ...
- Kafka 0.9+Zookeeper3.4.6集群搭建、配置,新Client API的使用要点,高可用性测试,以及各种坑 (转载)
Kafka 0.9版本对java client的api做出了较大调整,本文主要总结了Kafka 0.9在集群搭建.高可用性.新API方面的相关过程和细节,以及本人在安装调试过程中踩出的各种坑. 关于K ...
随机推荐
- win32 socket之select
之前光看理论是不行滴,一定要实践,实践啊,不然永远都是门外汉!! 嗯嗯,把找到的一段源码贴上先,稍微修改了一下: #include <winsock.h> #include <std ...
- MySQL的初次见面礼基础实战篇
[版权申明] http://blog.csdn.net/javazejian/article/details/61614366 出自[zejian的博客] 关联文章: MySQL的初次见面礼基础实战篇 ...
- Http网络协议
目录结构: contents structure [-] 什么是HTTP协议 Http协议的发展历史 Http的报文结构 客户端请求 服务端响应消息 Content-Type application/ ...
- C# 使用Xamarin开发Android应用程序
C#使用Xamarin开发可移植移动应用终章(11.获取设备信息与常用组件,开源一个可开发模版.) 摘要: 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://gi ...
- c# 中内部类的简单介绍 C#内部类
最近在看java一方面的书籍,看到一个很奇怪的问题,java类中还可以再定义一个类,这种结构非常特殊!后来才发现我知识浅薄了,原来C#中也有内部类,之前都一直没有注意过这个语法结构! 使用内部类有这样 ...
- angular之service、factory预provider区别
昨晚项目组做了angular分享,刚好有讨论到这个问题.虽然许久不做前端开发,但是兴趣所致.就查阅了下资料,以便后续需要使用 自己的理解:service是new出来的,factory是直接使用就能获得 ...
- High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
原文地址:https://www.codeproject.com/articles/14075/high-speed-charting-control 本文翻译在CodeProject上的介绍(主要还 ...
- C#中关于DataGridView行和列的背景色-前景色设置
关于DataGridView行和列的背景色-前景色设置 1.设定DataGridView全部单元格的Style DataGridView内所有单元格的Style变更,可以使用DataGridView ...
- Nginx 通过certbot 配置let's encrypt 证书 【转载,整理】
重要目录:/usr/local/certbot,/var/log/letencrypt,/etc/letencrypt
- Android studio的一些常用快捷键
Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...