OsgiPlugin - 插件永远不会解决服务错误

J. *_*Doe 8 java jira jira-plugin

我开始开发jira插件,但是我遇到了错误.

我最近的一个,我无法修复

[INFO] [talledLocalContainer] QuickReload - 插件安装程序错误[caposgi.factory.OsgiPlugin]插件'xy'从未使用过滤器'解析服务'&classname'(&(objectClass = xy.classname)(objectClass = xy.classname))'

这里出了什么问题?

use*_*695 14

当您尝试将插件的另一个对象注入插件的对象时,就会发生这种情况,就像另一个对象是另一个不同的插件并导出为公共OSGi服务一样.

在JIRA中,您可以将插件Java类声明为组件.这意味着实例化和依赖注入(例如通过构造函数)将自动委托给作为JIRA一部分的Spring Framework.通常我们这样做会失去对实例化和类依赖性的关注.公共和私人有两种类型的组件.公共组件可用于导入不同于您的插件.其他插件可以导入它们,然后通过依赖注入使用它们.私有组件将与公共组件一样工作,但其他插件将无法导入或查看它们.

如果你有一个组件,比如A依赖于另一个组件,B它们都是你插件的一部分,你就不应该导入组件B,A因为它已经是你插件的一部分了.在JIRA 7之前导入您放置在atlassian-plugin.xmla <component-import>元素上的组件.@ComponentImport当您通过构造函数执行依赖项注入时,您在构造函数参数之前放置了JIRA 7 .

所以我认为你做错<component-import>了就是直接从你的插件中加入一个组件而不是<component>.或者,如果您有JIRA 7或更高版本,那么您所做的错误就是放在@ComponentImport您自己的插件的组件之前,解决方案就是删除该注释.至少最后一个是我的情况,并从相同的插件中删除了依赖注入来自同一个插件的组件的注释.

  • 基于OP使用"xyz.classname"的事实,目前还不清楚,但是对于spring-scanner 2.x,你不会*@ComponentImport用于同一个bundle中的任何内容,只有你的上下文外部的服务.对于您自己的组件,您省略了注释.所以jpllossa的答案可能是正确的. (3认同)

jpl*_*osa 7

当我为Confluence v6.1.3开发一个插件时遇到类似的问题.我正在从Atlassian Spring Scanner v1迁移到v2.按照Atlassian Spring Scanner v2指南中的说明操作后,我认为这样做很好但是有这个错误:

[INFO] [talledLocalContainer] 2017-08-24 22:54:52,602错误[localhost-startStop-1] [plugin.osgi.factory.OsgiPlugin] logAndClearOustandingDependencies插件'com.confluenceservice.confluence.plugin.page-seen'从未解决过service'&pageViewedService'with filter'(&(objectClass = com.confluenceservice.confluence.plugin.PageViewedService)(objectClass = com.confluenceservice.confluence.plugin.PageViewedService))'

导致此错误的原因是@ComponentImport PageViewedService service:

@Autowired
public AlertUserMacro(@ComponentImport PageViewedService service, 
        @ComponentImport PageManager pageManager) {
    //constructor...
}
Run Code Online (Sandbox Code Playgroud)

这在Spring Scanner v1中是可以的,但在Spring Scanner v2中没有.不需要导入,因为它PageViewedService是我的插件的一部分.我需要导入,PageManager因为它的范围超出了我的插件.解决方案:

@Autowired
public AlertUserMacro(PageViewedService service, @ComponentImport PageManager pageManager) {
    //constructor
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.