Я пытаюсь создать плагин Jira
с помощью проекта.Класс AddProjectHook не найден
Вот мой код:
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>myGroup</groupId>
<artifactId>project-template</artifactId>
<version>1.0</version>
<packaging>atlassian-plugin</packaging>
<dependencies>
<dependency>
<groupId>com.atlassian.jira</groupId>
<artifactId>jira-api</artifactId>
<version>${jira.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.atlassian.jira.plugins</groupId>
<artifactId>project-templates-api</artifactId>
<version>${project.templates.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-jira-plugin</artifactId>
<version>${amps.version}</version>
<extensions>true</extensions>
<configuration>
<productVersion>${jira.version}</productVersion>
<productDataVersion>${jira.version}</productDataVersion>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<jira.version>7.2.1</jira.version>
<project.templates.version>2.18</project.templates.version>
<amps.version>6.2.6</amps.version>
</properties>
</project>
Atlassian-plugin.xml частично:
<atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}" plugins-version="2">
....
<project-blueprint key="my-project-template" weight="90">
....
<add-project>
<hook class="com.example.plugins.tutorial.MyAddProjectHook"/>
<descriptor file="/config/my-project-template-config.json"/>
</add-project>
</project-blueprint>
</atlassian-plugin>
MyAddProjectHook.java:
package com.example.plugins.tutorial;
import com.atlassian.jira.blueprint.api.AddProjectHook;
import com.atlassian.jira.blueprint.api.ConfigureData;
import com.atlassian.jira.blueprint.api.ConfigureResponse;
import com.atlassian.jira.blueprint.api.ValidateData;
import com.atlassian.jira.blueprint.api.ValidateResponse;
public class MyAddProjectHook implements AddProjectHook
{
@Override
public ValidateResponse validate(final ValidateData validateData)
{
ValidateResponse validateResponse = ValidateResponse.create();
if (validateData.projectKey().equals("TEST"))
{
validateResponse.addErrorMessage("Invalid Project Key");
}
return validateResponse;
}
@Override
public ConfigureResponse configure(final ConfigureData configureData)
{
ConfigureResponse configureResponse = ConfigureResponse.create().setRedirect("/issues/");
return configureResponse;
}
}
После того, как я построил и запустил его, используя jira:run
Я получаю исключение.
[INFO] [talledLocalContainer] 2016-09-12 17:32:23,211 http-nio-2990-exec-10 ERROR admin 1052x116x1 10vw23 172.20.49.83 /rest/project-templates/1.0/templates [c.a.p.r.c.error.jersey.ThrowableExceptionMapper] Uncaught exception thrown by REST service: java.lang.NoClassDefFoundError: com/atlassian/jira/blueprint/api/AddProjectHook
[INFO] [talledLocalContainer] com.atlassian.util.concurrent.LazyReference$InitializationException: java.lang.NoClassDefFoundError: com/atlassian/jira/blueprint/api/AddProjectHook
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:149)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:112)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.ResettableLazyReference.get(ResettableLazyReference.java:92)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.getModule(ProjectTemplateModuleDescriptor.java:103)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.ProjectTemplateManagerImpl.toProjectTemplate(ProjectTemplateManagerImpl.java:74)
[INFO] [talledLocalContainer] at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
[INFO] [talledLocalContainer] at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
[INFO] [talledLocalContainer] at java.util.Iterator.forEachRemaining(Iterator.java:116)
[INFO] [talledLocalContainer] at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
[INFO] [talledLocalContainer] at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
[INFO] [talledLocalContainer] at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
[INFO] [talledLocalContainer] at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
[INFO] [talledLocalContainer] at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
[INFO] [talledLocalContainer] at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.ProjectTemplateManagerImpl.getProjectTemplates(ProjectTemplateManagerImpl.java:43)
[INFO] [talledLocalContainer] ... 3 filtered
[INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:498)
[INFO] [talledLocalContainer] at com.atlassian.plugin.util.ContextClassLoaderSettingInvocationHandler.invoke(ContextClassLoaderSettingInvocationHandler.java:26)
[INFO] [talledLocalContainer] at com.sun.proxy.$Proxy165.getProjectTemplates(Unknown Source)
[INFO] [talledLocalContainer] ... 3 filtered
[INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:498)
[INFO] [talledLocalContainer] at com.atlassian.plugin.osgi.bridge.external.HostComponentFactoryBean$DynamicServiceInvocationHandler.invoke(HostComponentFactoryBean.java:136)
[INFO] [talledLocalContainer] at com.sun.proxy.$Proxy165.getProjectTemplates(Unknown Source)
[INFO] [talledLocalContainer] at com.atlassian.jira.projecttemplates.service.ProjectTemplateServiceImpl.getProjectTemplatesGroupedByProjectType(ProjectTemplateServiceImpl.java:147)
[INFO] [talledLocalContainer] at com.atlassian.jira.projecttemplates.service.ProjectTemplateServiceImpl.getProjectTemplatesGroupedByType(ProjectTemplateServiceImpl.java:102)
[INFO] [talledLocalContainer] at com.atlassian.jira.projecttemplates.rest.ProjectTemplatesResource.getProjectTemplates(ProjectTemplatesResource.java:94)
[INFO] [talledLocalContainer] ... 3 filtered
[INFO] [talledLocalContainer] at java.lang.reflect.Method.invoke(Method.java:498)
[INFO] [talledLocalContainer] ... 18 filtered
[INFO] [talledLocalContainer] at com.atlassian.plugins.rest.module.RestDelegatingServletFilter$JerseyOsgiServletContainer.doFilter(RestDelegatingServletFilter.java:154)
[INFO] [talledLocalContainer] ... 1 filtered
[INFO] [talledLocalContainer] at com.atlassian.plugins.rest.module.RestDelegatingServletFilter.doFilter(RestDelegatingServletFilter.java:68)
[INFO] [talledLocalContainer] ... 36 filtered
[INFO] [talledLocalContainer] at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
[INFO] [talledLocalContainer] ... 24 filtered
[INFO] [talledLocalContainer] at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59)
[INFO] [talledLocalContainer] ... 32 filtered
[INFO] [talledLocalContainer] at com.atlassian.jira.security.JiraSecurityFilter.lambda$doFilter$0(JiraSecurityFilter.java:76)
[INFO] [talledLocalContainer] ... 1 filtered
[INFO] [talledLocalContainer] at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:74)
[INFO] [talledLocalContainer] ... 16 filtered
[INFO] [talledLocalContainer] at com.atlassian.plugins.rest.module.servlet.RestSeraphFilter.doFilter(RestSeraphFilter.java:37)
[INFO] [talledLocalContainer] ... 20 filtered
[INFO] [talledLocalContainer] at com.atlassian.jira.servermetrics.CorrelationIdPopulatorFilter.doFilter(CorrelationIdPopulatorFilter.java:30)
[INFO] [talledLocalContainer] ... 5 filtered
[INFO] [talledLocalContainer] at com.atlassian.fastdev.AutoReloadFilter.doFilter(AutoReloadFilter.java:63)
[INFO] [talledLocalContainer] ... 8 filtered
[INFO] [talledLocalContainer] at com.atlassian.web.servlet.plugin.request.RedirectInterceptingFilter.doFilter(RedirectInterceptingFilter.java:21)
[INFO] [talledLocalContainer] ... 4 filtered
[INFO] [talledLocalContainer] at com.atlassian.web.servlet.plugin.LocationCleanerFilter.doFilter(LocationCleanerFilter.java:36)
[INFO] [talledLocalContainer] ... 29 filtered
[INFO] [talledLocalContainer] at com.atlassian.jira.servermetrics.MetricsCollectorFilter.doFilter(MetricsCollectorFilter.java:25)
[INFO] [talledLocalContainer] ... 28 filtered
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[INFO] [talledLocalContainer] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[INFO] [talledLocalContainer] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
[INFO] [talledLocalContainer] at java.lang.Thread.run(Thread.java:745)
[INFO] [talledLocalContainer] Caused by: java.lang.NoClassDefFoundError: com/atlassian/jira/blueprint/api/AddProjectHook
[INFO] [talledLocalContainer] at java.lang.ClassLoader.defineClass1(Native Method)
[INFO] [talledLocalContainer] at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2279)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1501)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
[INFO] [talledLocalContainer] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[INFO] [talledLocalContainer] at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1844)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:937)
[INFO] [talledLocalContainer] at com.atlassian.plugin.osgi.util.BundleClassLoaderAccessor.loadClass(BundleClassLoaderAccessor.java:45)
[INFO] [talledLocalContainer] at com.atlassian.plugin.osgi.factory.OsgiPluginInstalledHelper.loadClass(OsgiPluginInstalledHelper.java:56)
[INFO] [talledLocalContainer] at com.atlassian.plugin.osgi.factory.OsgiPlugin.loadClass(OsgiPlugin.java:207)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.checkClassExists(ProjectTemplateModuleDescriptor.java:219)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.createAddProjectModuleForTemplateElement(ProjectTemplateModuleDescriptor.java:145)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.createModuleFromXml(ProjectTemplateModuleDescriptor.java:134)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.access$100(ProjectTemplateModuleDescriptor.java:37)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor$1.create(ProjectTemplateModuleDescriptor.java:59)
[INFO] [talledLocalContainer] at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor$1.create(ProjectTemplateModuleDescriptor.java:56)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.ResettableLazyReference$InternalReference.create(ResettableLazyReference.java:182)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:325)
[INFO] [talledLocalContainer] at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:143)
[INFO] [talledLocalContainer] ... 271 more
[INFO] [talledLocalContainer] Caused by: java.lang.ClassNotFoundException: com.atlassian.jira.blueprint.api.AddProjectHook not found by com.atlassian.jira.plugins.project-templates-plugin [100]
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
[INFO] [talledLocalContainer] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1374)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1484)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
[INFO] [talledLocalContainer] at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
[INFO] [talledLocalContainer] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[INFO] [talledLocalContainer] ... 292 more
Вопрос: как исправить это исключение?
Я понимаю, что этот класс недоступен для некоторых ClasssLoader
, но не знаю: должно ли оно быть в OSGi
зависимостях или в пути к классам.