很多公司都会用JIRA这个软件来管理项目,确实是个不错的工具。但是最近经过一番思考,发现任何软件能力范围毕竟是有限的,工具也毕竟是工具,只有量身定做的设计和架构才是最适合的和最能发挥高效的选择。所以开始尝试着对JIRA做一些扩展和集成。目标是能对JIRA里的Project, Issue等信息从外部自己定制的程序中读取,并在必要的时候去操作。JIRA官方提供了多种plugin和扩展的接口,其中以笔者较熟的Java来实现的方式有两种:
1. XML-RPC
2. Rest API
1. XML-RPC
Core Lib: Apache XML RPC
Official reference: http://docs.atlassian.com/software/jira/docs/api/rpc-jira-plugin/latest/com/atlassian/jira/rpc/xmlrpc/XmlRpcService.html
Depends on Jar Used: xmlrpc-common-3.1.3.jar, common-logging-1.1.jar, ws-commons-util-1.0.2.jar, xmlrpc-client-3.1.3.jar, xmlrpc-server-3.1.3.jar
Sample Code:
public class RPCDemo {
public static final String JIRA_URI = "<your JIRA URL>";
public static final String RPC_PATH = "/rpc/xmlrpc";
public static final String USER_NAME = "<JIRA Username>";
public static final String PASSWORD = "<password>";
public static void main(String[] args) throws Exception{
XmlRpcClient rpcClient;
XmlRpcClientConfigImpl config;
config = new XmlRpcClientConfigImpl();
config.setServerURL(new URL(JIRA_URI+RPC_PATH));
rpcClient = new XmlRpcClient();
rpcClient.setConfig(config);
Vector<String> loginParams = new Vector<String>(2);
loginParams.add(USER_NAME);
loginParams.add(PASSWORD);
String loginToken = (String)rpcClient.execute("jira1.login", loginParams);
Vector<String> loginTokenVector = new Vector<String>(1);
loginTokenVector.add(loginToken);
Object[] projects = (Object[])rpcClient.execute("jira1.getProjectsNoSchemes", loginTokenVector);
//Print Projects
for(int i=0;i<projects.length;i++){
Map<String,String> project = (Map<String,String>)projects[i];
System.out.println("KEY: "+project.get("key")+"\tNAME: "+ project.get("name")+"\tLEAD: "+project.get("lead"));
}
}}
2. Rest API
RPC的缺点是必须要用户登录,获知密码才能拿到JIRA里的信息,而且对于Issue的全套属性并不能全部拿到,官方一直也没有更新。后来查阅Rest API的实现方式之后,发现解决了RPC所有的缺点。
Core Lib: jira-rest-java-client-0.3.1.jar
Official reference:https://studio.atlassian.com/wiki/display/JRJC/Tutorial
Depends on Jar Used: jersey-bundle-1.9.jar, jersey-apache-client-1.9.jar, jersey-client-1.9.jar, joda-time-2.0.jar, jsr311-api-1.0-1.3.0.jar, jettison-1.2.jar, jersey-core-1.9.jar, guava-r09.jar, commons-httpclient-3.0.jar, commons-codec-1.5.jar, commons-logging.jar
Sample Code;
public class JiraConnection {
private JiraRestClient restClient;
private NullProgressMonitor pm;
private boolean initSuccess = false;
public JiraConnection(){
try{
JerseyJiraRestClientFactory factory = new JerseyJiraRestClientFactory();
URI jiraServerUri = new URI("<your JIRA URL>");
AnonymousAuthenticationHandler anonymousHandler = new AnonymousAuthenticationHandler();
restClient = factory.create(jiraServerUri, anonymousHandler);
pm = new NullProgressMonitor();
initSuccess = true;
}catch(Exception ex){
initSuccess = false;
}
}
}