最近在折腾Jira的二次开发,说实话,二次开发需要对系统的架构有一定的了解才好下手。虽然Jira这个产品很完善,官方有很详细的文档供开发者参考,但小弟还是花了不少时间研究,开发了近一个月的时间,现在把一些用到的知识和问题整理出来,与大家分享。
这次开发主要是做一个中间件,用来连接jira系统和其他系统从而实现系统之间的相互的通信,如创建一个问题(Issue),对jira里一些问题(即Issue)信息的修改,流程步骤(workflowstep)的改变,添加与更新字段(Field)和自定义字段(customerField)的等等。这里用到了jira-rest-java-client包来实现对jira的访问。
部分操作Jira的代码:
002
import
java.net.URISyntaxException;
003
import
java.util.ArrayList;
004
import
java.util.List;
005
import
com.atlassian.jira.rest.client.JiraRestClient;
006
import
com.atlassian.jira.rest.client.NullProgressMonitor;
007
import
com.atlassian.jira.rest.client.domain.BasicIssue;
008
import
com.atlassian.jira.rest.client.domain.BasicProject;
009
import
com.atlassian.jira.rest.client.domain.Issue;
010
import
com.atlassian.jira.rest.client.domain.User;
011
import
com.atlassian.jira.rest.client.domain.input.FieldInput;
012
import
com.atlassian.jira.rest.client.domain.input.IssueInput;
013
import
com.atlassian.jira.rest.client.domain.input.IssueInputBuilder;
014
import
com.atlassian.jira.rest.client.internal.jersey.JerseyJiraRestClientFactory;
019
static
JerseyJiraRestClientFactory factory =
new
JerseyJiraRestClientFactory();
020
static
NullProgressMonitor pm =
new
NullProgressMonitor();
021
static
String uri=
"http://localhost:8100"
;
022
static
String user=
"gfjira"
;
023
static
String pwd=
"123456"
;
027
public
static
void
main(String[] args) {
032
public
static
void
getIssue(String issueKey)
throws
URISyntaxException{
034
URI jiraServerUri =
new
URI(uri);
035
JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
036
jiraServerUri, user, pwd);
038
Issue issue = restClient.getIssueClient().getIssue(issueKey, pm);
040
User usr = restClient.getUserClient().getUser(user, pm);
041
System.out.println(usr);
042
System.out.println(issue);
054
public
static
void
createIssue(String projectName,String issueType,String description,String summary)
throws
URISyntaxException{
056
URI jiraServerUri =
new
URI(uri);
057
JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
058
jiraServerUri, user, pwd);
059
IssueInputBuilder issueBuilder =
new
IssueInputBuilder(
"ProjectKey"
,
060
Long.valueOf(issueType));
063
final
URI projectUri =
new
URI(
064
"http://localhost:8100/rest/api/2/project/IT"
);
065
BasicProject bporject =
new
BasicProject(projectUri, projectName,
""
,
067
issueBuilder.setProject(bporject);
068
issueBuilder.setDescription(description);
069
issueBuilder.setSummary(summary);
072
IssueInput issueInput = issueBuilder.build();
073
BasicIssue bIssue = restClient.getIssueClient().createIssue(issueInput,
076
System.out.println(bIssue.getKey());
077
} <SPAN></SPAN>
public
static
void
updateIssueField(String key,String field,String value)
throws
URISyntaxException{
080
URI jiraServerUri =
new
URI(uri);
081
JiraRestClient restClient = factory.createWithBasicHttpAuthentication(
082
jiraServerUri, user, pwd);
084
Issue issue = restClient.getIssueClient().getIssue(key, pm);
086
List<FieldInput> fields =
new
ArrayList<FieldInput>();
087
fields.add(fieldinput);
088
restClient.getIssueClient().update(issue, fields, pm);
092
public
static
void
changeIssueStatus(String issuekey)
throws
URISyntaxException
096
URI jiraServerUri =
new
URI(uri);
097
JiraRestClient restClient = factory
098
.createWithBasicHttpAuthentication(jiraServerUri, user,
100
Issue issue = restClient.getIssueClient().getIssue(issuekey, pm);
102
TransitionInput tinput=
new
TransitionInput(
3
);
103
restClient.getIssueClient().transition(issue,
就上面这段代码都折腾了我好久,特别是jira-rest-java-client 的版本问题,最新的版本找不到需要的函数,却在旧的版本(1.1.m02,这个版本很奇葩吧)里有需要的函数,该死的官方没有说清楚,害得我一个一个的测试。这里想说的是changeIssueStatus这个方法,issue的workflow是不可以随便改变的,必须按照流程图的顺序进行改变,其实就是提供一个id值,图中红色的区域可查到具体的id值,比如当前issue的状态是open,要改变成resolved的状态,就要"5"这个值,即
1
TransitionInput tinput=
new
TransitionInput(
5
);
同理,要改变成closed,就用"2"这个值
1
TransitionInput tinput=
new
TransitionInput(
2
);
既然是二次开发,系统就少不了前端开发,那就要用到javascript了,考虑到Jira系统自身的复杂和以后版本升级带来的问题,所以没有对源码的js进行修改,而是利用了jira里提供的一个customer field,他可以让我们往里面添加html,css,javascript,而且是基于Jquery的,虽然称不上完美,但是还勉强能实现需求的功能。
暂时整理出这么多,希望各位大侠能多喷多给意见:D