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

时间:2016-08-10 13:01:23

标签: java jira jira-plugin

我开始开发jira插件,但我收到了错误。

我最新的一个,我无法解决的是

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

这里出了什么问题?

2 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:6)

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

[INFO] [talledLocalContainer] 2017-08-24 22:54:52,602 ERROR [localhost-startStop-1] [plugin.osgi.factory.OsgiPlugin] logAndClearOustandingDependencies Plugin'com.confluenceservice.confluence.plugin。页面浏览'永不解决的服务'&amp; pageViewedService'with filter'(&amp;(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...
}

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

@Autowired
public AlertUserMacro(PageViewedService service, @ComponentImport PageManager pageManager) {
    //constructor
}

希望这有帮助。