Я знаю, что это своего рода поздний ответ, но для людей, приземляющихся здесь, есть несколько вещей, не упомянутых в других постах, которые важны при разработке плагинов для JIRA (и других продуктов Atlassian).
Первый JIRA, точнее Atlassian, имеет два типа плагинов, см. Различия между плагинами1 и плагинами2
Поскольку это было ClassNotFoundException (и JIRA v4.0.1), я предполагаю, что подключаемый модуль представляет собой Plugin2, который может использоваться в JIRA v4 и более поздних версиях.
Начиная с JIRA v4, JIRA действует как контейнер OSGi, и, следовательно, Plugin2 является пакетом OSGi. В OSGi каждый пакет имеет свой собственный набор загрузчиков классов. Это позволяет различным пакетам иметь разные версии одних и тех же jar-файлов и, в числе прочего, оперативно развертываться. Однако выгода заключается в том, что не все пакеты из JDK по умолчанию доступны для этих загрузчиков классов. Это объясняется в разделе Плагины, комплекты и OSGi на веб-странице Atlassian Developers . Более подробное описание можно найти в блоге Отображение пути к загрузочному классу в OSGi в Springsource. Второй абзац там даже имеет заголовок NoClassDefFoundError: com.sun…
Так много для теории.
При разработке подключаемого модуля для JIRA с помощью Atlassian SDK Maven используется за кулисами, см. Документация по Atlassian Plugin SDK . Так что в проекте плагина будет pom.xml. Чтобы включить пакеты JDK в плагин, можно добавить тег <SystemProperties>
к maven-jira-plugin (для других продуктов Atlassian есть соответствующий плагин maven), и установите свойство bootdelegation (и вы можете установить java в 1.6 для maven-compiler-plugin ):
...
<build>
<plugins>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-jira-plugin</artifactId>
<version>3.7.3</version>
<extensions>true</extensions>
<configuration>
<productVersion>${jira.version}</productVersion>
<productDataVersion>${jira.data.version}</productDataVersion>
<systemProperties>
<property>
<name>atlassian.org.osgi.framework.bootdelegation</name>
<value>sun.*,com.sun.*</value>
</property>
</systemProperties>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
...
</plugins>
</build>
...
Указанные пакеты будут доступны для пакета. Имейте в виду, однако, что делегирование загрузки не является решением всех проблем и должно использоваться только с ограничениями. Узнайте больше на Boot Delegation и Избегайте взлома Classloader .
Под зависимостями можно установить jaxb-api нужную версию:
...
<dependencies>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>atlassian-jira</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.plugins.rest</groupId>
<artifactId>atlassian-rest-common</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.4</version>
<scope>provided</scope>
</dependency>
...
</dependencies>
...
Не всегда необходимо явно иметь зависимость от jaxb-api . Например, плагин atlassian-rest-common выше имеет транзитивную зависимость от jaxb-api .
Важно понимать настройку scope . Посмотрите на Установка инструкций OSGi Manifest в вашем плагине (на той же странице, что и Плагины, комплекты и OSGi , но далее).
Заинтригованный может узнать больше на Спецификации OSGi Alliance и Сообщество OSGi Wiki .