未找到 AddProjectHook class

AddProjectHook class not found

我尝试使用项目挂钩创建 Jira 插件。

这是我的代码:

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.accept(ReferencePipeline.java:193)
[INFO] [talledLocalContainer]   at java.util.stream.ReferencePipeline.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[=14=](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.access0(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.access0(ProjectTemplateModuleDescriptor.java:37)
[INFO] [talledLocalContainer]   at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.create(ProjectTemplateModuleDescriptor.java:59)
[INFO] [talledLocalContainer]   at com.atlassian.jira.project.template.descriptor.ProjectTemplateModuleDescriptor.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.access0(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.access0(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

问题是:如何解决这个异常?

我知道 class 对某些 ClasssLoader 是不可访问的,但不知道:它应该在 OSGi 依赖项中还是在 class 路径中。

问题是 JIRA 使用了不同版本的 API 库。