2016-03-09 23 views
1

我是OSGi中的新成員。我寫了JIRA插件,它是Apache Felix Bundle。我的包使用Sprring Framework RestTemplateJackson XML進行簡單的REST API調用。可選包分辨率

所以我使用其他軟件包(可在OSGi的containter):Apache ServiceMix :: Bundles :: spring-web具有<Import-Package>設置爲com.fasterxml.jackson.*; version="[2,3)";resolution:="optional"

我安裝jackson-databindjackson-corejackson-annotations(所有版本2.6.5)在OSGi容器提供失蹤,可選依賴。

完整的源代碼可在我的github

當我安裝我的插件一切正常,但在運行時我收到錯誤:

2016-03-09 10:47:55,431 http-nio-2990-exec-11 ERROR achomont 647x10800x1 1wof9hv 0:0:0:0:0:0:0:1 /secure/CreateWorklog.jspa [c.a.event.internal.AsynchronousAbleEventDispatcher] There was an exception thrown trying to dispatch event [WorklogCreatedEvent{[email protected]}] from the invoker [SingleParameterMethodListenerInvoker{method=public void com.company.soft.mycompany.work.log.plugin.listeners.WorkLogIssueListener.onWorklogEvent(com.atlassian.jira.event.worklog.WorklogEvent), listener=com.compan[email protected]7491b5aa}] 
java.lang.RuntimeException: com/fasterxml/jackson/core/JsonProcessingException 
    at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:54) 
    at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$1$1.run(AsynchronousAbleEventDispatcher.java:48) 
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:299) 
    at com.atlassian.event.internal.AsynchronousAbleEventDispatcher.dispatch(AsynchronousAbleEventDispatcher.java:107) 
    at com.atlassian.event.internal.EventPublisherImpl.invokeListeners(EventPublisherImpl.java:160) 
    at com.atlassian.event.internal.EventPublisherImpl.publish(EventPublisherImpl.java:79) 
    at java.util.Optional.ifPresent(Optional.java:159) 
    at com.atlassian.jira.issue.worklog.DefaultTimeTrackingIssueUpdater.dispatchEvent(DefaultTimeTrackingIssueUpdater.java:242) 
    at com.atlassian.jira.issue.worklog.DefaultTimeTrackingIssueUpdater.doUpdate(DefaultTimeTrackingIssueUpdater.java:221) 
    at com.atlassian.jira.issue.worklog.DefaultTimeTrackingIssueUpdater.updateIssue(DefaultTimeTrackingIssueUpdater.java:202) 
    at com.atlassian.jira.issue.worklog.DefaultTimeTrackingIssueUpdater.updateIssueOnWorklogCreate(DefaultTimeTrackingIssueUpdater.java:89) 
    at com.atlassian.jira.issue.worklog.DefaultWorklogManager.create(DefaultWorklogManager.java:68) 
    at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.create(DefaultWorklogService.java:724) 
    at com.atlassian.jira.bc.issue.worklog.DefaultWorklogService.createAndAutoAdjustRemainingEstimate(DefaultWorklogService.java:381) 
    at com.atlassian.jira.web.action.issue.CreateWorklog.doExecute(CreateWorklog.java:100) 
    ... 1 filtered 
    at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:63) 
    ... 7 filtered 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    ... 74 filtered 
    at com.atlassian.labs.httpservice.resource.ResourceFilter.doFilter(ResourceFilter.java:59) 
    ... 38 filtered 
    at com.atlassian.jira.security.JiraSecurityFilter.doFilter(JiraSecurityFilter.java:70) 
    ... 37 filtered 
    at com.atlassian.fastdev.AutoReloadFilter.doFilter(AutoReloadFilter.java:63) 
    ... 55 filtered 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException 
    at com.company.soft.mycompany.connector.impl.MycompanyConnectorImpl.sendWorklogData(MycompanyConnectorImpl.java:80) 
    at com.company.soft.mycompany.connector.impl.MycompanyConnectorImpl.sendWorklogData1(MycompanyConnectorImpl.java:96) 
    at com.company.soft.mycompany.connector.impl.MycompanyConnectorImpl.sendWorklogDataWithCheck(MycompanyConnectorImpl.java:100) 
    at com.company.soft.mycompany.connector.impl.MycompanyConnectorImpl.sendAddWorkLogData(MycompanyConnectorImpl.java:65) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    ... 1 filtered 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 
    at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.doInvoke(ServiceInvoker.java:56) 
    at org.eclipse.gemini.blueprint.service.importer.support.internal.aop.ServiceInvoker.invoke(ServiceInvoker.java:60) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invokeUnprivileged(ServiceTCCLInterceptor.java:70) 
    at org.eclipse.gemini.blueprint.service.util.internal.aop.ServiceTCCLInterceptor.invoke(ServiceTCCLInterceptor.java:53) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.eclipse.gemini.blueprint.service.importer.support.LocalBundleContextAdvice.invoke(LocalBundleContextAdvice.java:57) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:133) 
    at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:121) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy2639.sendAddWorkLogData(Unknown Source) 
    at com.company.soft.mycompany.work.log.plugin.listeners.WorkLogIssueListener.sendWorkLogData(WorkLogIssueListener.java:115) 
    at com.company.soft.mycompany.work.log.plugin.listeners.WorkLogIssueListener.onWorklogEvent(WorkLogIssueListener.java:63) 
    ... 3 filtered 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:36) 
    ... 235 more 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException not found by org.apache.servicemix.bundles.spring-web [13] 
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532) 
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75) 
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 267 more 

它看起來像OSGi的containter 不弄清楚com.fasterxml.jackson.core現已推出。

  1. 我應該以何種方式重新加載Apache ServiceMix :: Bundles :: spring-web
  2. 或mayby我需要以另一種方式做它?

我希望有人能幫助我。

+0

我還嘗試將傑克遜圖片文件打包到我的插件包(可在我的MANIFEST.MF Bundle-ClassPath中找到),但它也無濟於事。 –

回答

1

如果你的包有一個可選的導入,並且允許它在沒有導入到導出器的情況下解析,那麼這種情況會持續下去,直到你執行「刷新」操作。 OSGi試圖將綁定導入/導出配線儘可能保持靜態,因爲重新計算可能會很昂貴,並且也會迫使綁定重新啓動。

所以如果你想OSGi連接到現在可用的導入,你需要刷新。這可以通過輸入refresh命令在Gogo shell中完成。

+0

嗨@尼爾再次:) - 我忘了添加鏈接到源代碼在github上。我的包依賴於bundle'spring-web',它有可選的導入到Jackson中。在運行時,它會拋出'ClassNotFoundException',無論我添加Jackson依賴關係如何將它們打包或安裝爲OSGi包含器中的獨立包。在這種情況下,我應該叫'refresh'嗎? –

+1

保持簡單:*無論何時*您安裝,更新或移除一個或一組軟件包,您都必須*隨時*調用刷新。 –

+0

'refresh'解決了我的問題! (thx @Neil) –