Как при разработке плагина для 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.
Соберем 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. Это будет выглядеть примерно так:
Далее нужно запустить сервлет по адресу localhost:2990/jira/plugins/servlet/myservlet
В браузере появится сообщение из плагина jira-library:
Готово: мы упаковали файл jira-library.jar в jira-obr.obr и смогли успешно вызвать функцию getLibraryMessage.