Хабрахабр

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

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

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

 <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.2.2-atlassian-1</version> <scope>compile</scope> </dependency>

Собрать плагин таким образом, чтобы 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:

<dependency> <groupId>ru.matveev.alexey.tutorial.library</groupId> <artifactId>jira-library</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>system</scope> <systemPath>/home/alexm/atlasplugin/obr/jira-library/target/jira-library-1.0.0-SNAPSHOT.jar</systemPath>
</dependency>

Необходимо изменить /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 добавляем следующие строчки:

<pluginDependencies> <pluginDependency> <groupId>ru.matveev.alexey.tutorial.library</groupId> <artifactId>jira-library</artifactId> </pluginDependency> </pluginDependencies>

и в тег 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("<html><body>" + libraryService.getLibraryMessage() + "</body></html>"); } }

Всё. Теперь можем запускать 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.

Теги
Показать больше

Похожие статьи

Кнопка «Наверх»
Закрыть