Как при разработке плагина для Jira упаковать зависимую библиотеку в obr

При разработке плагинов для Jira периодически приходится использовать библиотеки, которых в Jira нет, поэтому их нужно установить вместе с разрабатываемым плагином. В Jira сторонние библиотеки можно упаковать в плагин двумя способами:

Указать у сторонней библиотеки область видимости компилирования, и тогда классы из этой библиотеки будут упакованы в jar-файл разрабатываемого плагина. Для этого необходимо в файле pom.xml написать:

  
            com.google.code.gson
            gson
            2.2.2-atlassian-1
	compile   

Собрать плагин таким образом, чтобы jar-файл сторонней библиотеки находился в папке dependencies файла obr разрабатываемого плагина.

Мы пошагово разберём упаковку зависимой библиотеки в папку dependencies obr-файла.
Теорию о том, как положить в obr дополнительные зависимости, можно почитать тут.

Рассмотрим пример. У нас есть основная библиотека (jira-library), содержащая сервис LibraryService с единственной функцией getLibraryMessage. Из другого плагина (jira-obr) мы будем вызывать функцию getLibraryMessage. Полученное значение будем выдавать в сервлете плагина jira-obr.

awuzjas9fc-ycwvk2wqjutxzeei.png

Соберем jira-obr таким образом, чтобы jira-library.jar находился в папке dependencies файла jira-obr.obr. При установке jira-obr.obr будет установлен и jira-library.jar.

Исходный код плагинов jira-library и jira-obr можно скачать здесь.

Создаем плагин jira-library


Открываем терминал и выполняем вот такую команду:

atlas-create-jira-plugin-module

По мере создания плагина терминал будет задавать вопросы. Ниже привожу вопросы и ответы на них:

Define value for groupId: : ru.matveev.alexey.tutorial.library
Define value for artifactId: : jira-library
Define value for version:  1.0.0-SNAPSHOT: : 
Define value for package:  ru.matveev.alexey.tutorial.library: : 
 Y: : Y

После создания плагина необходимо добавить сервис LibraryService. Для этого сначала создадим интерфейс (LibraryService.java) в пакете ru.matveev.alexey.tutorial.library.api

package ru.matveev.alexey.tutorial.library.api;

public interface LibraryService {
    String getLibraryMessage();
}

Затем создадим реализацию интерфейса LibraryService (LibraryServiceImpl.java) в пакете ru.matveev.alexey.tutorial.library.impl:

package ru.matveev.alexey.tutorial.library.impl;

import com.atlassian.plugin.spring.scanner.annotation.export.ExportAsService;
import ru.matveev.alexey.tutorial.library.api.LibraryService;

import javax.inject.Named;

@ExportAsService({LibraryService.class})
@Named
public class LibraryServiceImpl implements LibraryService {
    public String getLibraryMessage() {
        return "jira-library test message";
    }
}

Аннотация @ExportAsService нужна для того, чтобы сервис был доступен для других плагинов, что позволит обращаться к нему плагину jira-obr.

Собираем плагин:

altas-mvn package

После завершения сборки в папке jira-library/target можно увидеть собранный jar-файл.

Создаем jira-obr плагин


Исполняем в терминале вот такую команду:

atlas-create-jira-plugin

Ответить на вопросы необходимо следующим образом:

Define value for groupId: : ru.matveev.alexey.tutorial.obr
Define value for artifactId: : jira-obr
Define value for version:  1.0.0-SNAPSHOT: : 
Define value for package:  ru.matveev.alexey.tutorial.obr: : 
 Y: : Y

Затем переходим в папку jira-obr и создаем сервлет вот такой командой:

atlas-create-jira-plugin-module

На вопросы отвечаем так:

Choose a number (1/2/3/4/5/6/7/8/9/10/11/12/13/14/15/16/17/18/19/20/21/22/23/24/25/26/27/28/29/30/31/32/33/34): 21
Enter New Classname MyServlet: : 
Enter Package Name ru.matveev.alexey.tutorial.obr.servlet: : 
Show Advanced Setup? (Y/y/N/n) N: : N
Add Another Plugin Module? (Y/y/N/n) N: : N

Затем в файл pom.xml добавляем зависимость для плагина jira-library:


            ru.matveev.alexey.tutorial.library
            jira-library
            1.0.0-SNAPSHOT
            system
            /home/alexm/atlasplugin/obr/jira-library/target/jira-library-1.0.0-SNAPSHOT.jar

Необходимо изменить /home/alexm/atlasplugin/obr/jira-library/target/jira-library-1.0.0-SNAPSHOT.jar на путь, по которому находится файл jira-library-1.0.0-SNAPSHOT.jar.

В реальном окружении файл jira-library-1.0.0-SNAPSHOT.jar должен лежать в Artifactory, Nexus Repository Manager или иной подобной программе. В данном случае файл находится в файловой системе для упрощения примера.

Далее в pom.xml для maven-jira-plugin в тег configuration добавляем следующие строчки:


   
   ru.matveev.alexey.tutorial.library
   jira-library
   
 

и в тег Import-Package добавляем:

ru.matveev.alexey.tutorial.library.api,

Настройки нужны для автоматической упаковки jira-library-1.0.0-SNAPSHOT.jar в папку dependencies файла jira-obr.obr, а также формирования зависимости плагина jira-obr от плагина jira-library.

Далее изменяем содержимое MyServlet.java:

package ru.matveev.alexey.tutorial.obr.servlet;

import com.atlassian.plugin.spring.scanner.annotation.imports.ComponentImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.matveev.alexey.tutorial.library.api.LibraryService;

import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Named
public class MyServlet extends HttpServlet{
    private static final Logger log = LoggerFactory.getLogger(MyServlet.class);
    private final LibraryService libraryService;

    @Inject
    public MyServlet(@ComponentImport LibraryService libraryService) {
        this.libraryService = libraryService;
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        resp.setContentType("text/html");
        resp.getWriter().write("" + libraryService.getLibraryMessage() + "










");
    }

}

Всё. Теперь можем запускать Jira вот такой командой:

atlas-run

Jira будем запущена на localhost:2990/jira. Необходимо зайти в Jira под учетной записью admin: admin, перейти в Add-ons → Manage add-ons и установить плагин jira-obr, выбрав файл jira-obr.obr. После этого вы увидите среди установленных плагинов jira-library и jira-obr. Это будет выглядеть примерно так:

uzembzvnbafw1_xpsld_jmj-8dw.png

Далее нужно запустить сервлет по адресу localhost:2990/jira/plugins/servlet/myservlet

В браузере появится сообщение из плагина jira-library:

f4yqq6-yt4sgidfwsd3bnqfrb0g.png

Готово: мы упаковали файл jira-library.jar в jira-obr.obr и смогли успешно вызвать функцию getLibraryMessage.

© Habrahabr.ru