It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

Confluence: BeanDefinitionStoreException: does not load Plugins due to Spring-Scanner Exceptions

Matthias Steinböck Apr 09, 2018

Our client upgraded from Confluence 6.4.1 to 6.7.2

Sometimes we get BeanDefinitionStoreExceptions on startup leaving some plugins disabled:

 

2018-03-24 12:54:14,794 ERROR [ThreadPoolAsyncTaskExecutor::Thread 18] [internal.dependencies.startup.DependencyWaiterApplicationContextExecutor] fail Unable to create application context for [at.example.confluence.exampleplugin.example-plugin], unsatisfied dependencies: none
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL [bundle://230.0:0/META-INF/spring/plugin-context.xml]; nested exception is java.lang.IllegalStateException: Cannot execute atlassian-spring-scanner-runtime: plugin has an extra copy of atlassian-spring-scanner-annotation classes, perhaps embedded inside the target plugin 'at.example.confluence.exampleplugin.example-plugin'; embedding scanner-annotations is not supported since scanner version 2.0. Use 'mvn dependency:tree' and ensure the atlassian-spring-scanner-annotation dependency in your plugin has <scope>provided</scope>, not 'runtime' or 'compile', and you have NO dependency on atlassian-spring-scanner-runtime.
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
at org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:170)
at org.eclipse.gemini.blueprint.context.support.OsgiBundleXmlApplicationContext.loadBeanDefinitions(OsgiBundleXmlApplicationContext.java:140)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:609)
at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.access$800(AbstractDelegatedExecutionApplicationContext.java:60)
at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext$3.run(AbstractDelegatedExecutionApplicationContext.java:242)
at org.eclipse.gemini.blueprint.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)
at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.startRefresh(AbstractDelegatedExecutionApplicationContext.java:220)
at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.stageOne(DependencyWaiterApplicationContextExecutor.java:224)
at org.eclipse.gemini.blueprint.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor.refresh(DependencyWaiterApplicationContextExecutor.java:177)
at org.eclipse.gemini.blueprint.context.support.AbstractDelegatedExecutionApplicationContext.refresh(AbstractDelegatedExecutionApplicationContext.java:157)
at org.eclipse.gemini.blueprint.extender.internal.activator.LifecycleManager$1.run(LifecycleManager.java:207)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: Cannot execute atlassian-spring-scanner-runtime: plugin has an extra copy of atlassian-spring-scanner-annotation classes, perhaps embedded inside the target plugin 'at.example.confluence.exampleplugin.example-plugin'; embedding scanner-annotations is not supported since scanner version 2.0. Use 'mvn dependency:tree' and ensure the atlassian-spring-scanner-annotation dependency in your plugin has <scope>provided</scope>, not 'runtime' or 'compile', and you have NO dependency on atlassian-spring-scanner-runtime.
at com.atlassian.plugin.spring.scanner.runtime.impl.AtlassianScannerBeanDefinitionParser.checkScannerRuntimeIsNotEmbeddedInBundle(AtlassianScannerBeanDefinitionParser.java:198)
at com.atlassian.plugin.spring.scanner.runtime.impl.AtlassianScannerBeanDefinitionParser.parse(AtlassianScannerBeanDefinitionParser.java:60)
at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:168)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:138)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
... 20 more

 

The Atlassian-Support-Team told us:

We had similar cases where we found the trigger was from a couple of conflicting third party plugins which have dependencies on the system plugin results in both third party and systems plugins failing to be enabled during the startup.

We have both, 3rd party and custom plugins installed in the System.

How can "unsatisfied dependencies: none" cause such behaviour?

Here is the pom.xml for one of them:

 

<?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>at.example.confluence.exampleplugin</groupId>
<artifactId>example-plugin</artifactId>
<version>${plugin.version}</version>
<organization>
<name>Example Company</name>
<url>http://example.at</url>
</organization>
<name>Example Plugin</name>
<description>Example Plugin</description>
<packaging>atlassian-plugin</packaging>

<properties>
<confluence.version>6.7.2</confluence.version>
<confluence.data.version>6.7.2</confluence.data.version>
<amps.version>6.3.14</amps.version>
<atlassian.spring.scanner.version>2.1.0</atlassian.spring.scanner.version>
<atlassian.plugin.key>${project.groupId}.${project.artifactId}</atlassian.plugin.key>
<base.version>1.4.4</base.version>
<plugin.version>${base.version}</plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<profiles>
<profile>
<id>special</id>
<properties>
<profile.name>special</profile.name>
<plugin.version>${base.version}-special</plugin.version>
</properties>
</profile>
</profiles>

<dependencies>
<dependency>
<groupId>com.atlassian.confluence</groupId>
<artifactId>confluence</artifactId>
<version>${confluence.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.atlassian.analytics</groupId>
<artifactId>analytics-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-annotation</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.5.RELEASE</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/profiles/${profile.name}</directory>
<includes>
<include>*.properties</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>com.atlassian.plugin</groupId>
<artifactId>atlassian-spring-scanner-maven-plugin</artifactId>
<version>${atlassian.spring.scanner.version}</version>
<executions>
<execution>
<goals>
<goal>atlassian-spring-scanner</goal>
</goals>
<phase>process-classes</phase>
</execution>
</executions>
<configuration>
<verbose>true</verbose>
</configuration>
</plugin>
<plugin>
<groupId>com.atlassian.maven.plugins</groupId>
<artifactId>maven-confluence-plugin</artifactId>
<version>${amps.version}</version>
<extensions>true</extensions>
<configuration>
<productVersion>${confluence.version}</productVersion>
<productDataVersion>${confluence.data.version}</productDataVersion>
<enableQuickReload>true</enableQuickReload>
<enableFastdev>false</enableFastdev>
<extractDependencies>false</extractDependencies>
<allowGoogleTracking>false</allowGoogleTracking>
<log4jProperties>src/log4j/log4j.properties</log4jProperties>
<!-- See here for an explanation of default instructions: -->
<!-- https://developer.atlassian.com/docs/advanced-topics/configuration-of-instructions-in-atlassian-plugins -->
<instructions>
<Atlassian-Plugin-Key>${atlassian.plugin.key}</Atlassian-Plugin-Key>
<!-- Add package to export here -->
<Export-Package>at.example.confluence.exampleplugin.api,</Export-Package>
<!-- Add package import here -->
<Import-Package>com.atlassian.confluence.*;resolution:="optional", *</Import-Package>
<!-- Ensure plugin is spring powered -->
<Spring-Context>*</Spring-Context>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

Is there anything wrong that could lead to the aforementioned exception?

Can anybody help us clarifying if this exception is even related to bugs in pom.xml?

Does anybody have similar experiences with custom plugins in confluence (eg. not loading correctly, BeanDefinitionStoreException, InvalidStateException)?

1 answer

0 votes
Minh Tran Atlassian Team Apr 09, 2018

@Matthias Steinböck Can i see your atlassian-plugin.xml?

Matthias Steinböck Apr 09, 2018

Hey @Minh Tran thanks for your help!

 

here is the atlassian-plugin.xml. Do you think we did something wrong there?

 

<?xml version="1.0" encoding="UTF-8"?>

<atlassian-plugin key="${project.groupId}.${project.artifactId}" name="${project.name}" plugins-version="2">
<plugin-info>
<description key="at.example.confluence.exampleplugin.example-plugin.description" />
<version>${project.version}</version>
<vendor name="${project.organization.name}" url="${project.organization.url}" />
<param name="plugin-icon">images/icon.png</param>
<param name="plugin-logo">images/logo.png</param>
</plugin-info>

<!-- add our i18n resource -->
<resource type="i18n" name="i18n" location="example-plugin"/>
<resource type="download" name="images/" location="/images"/>

<!-- add our web resources -->
<web-resource key="example-plugin-resources" name="example-plugin Web Resources">
<dependency>com.atlassian.auiplugin:ajs</dependency>
<resource type="download" name="example-plugin.js" location="/js/example-plugin.js"/>
<resource type="download" name="example-plugin.css" location="/css/example-plugin.css" />

<context>example-plugin</context>
<context>atl.general</context>
</web-resource>

<web-resource key="css-pdf-resources" name="example-plugin PDF Resources">
<resource type="download" name="example-plugin.css" location="/css/example-plugin.css" />
<context>example-plugin</context>
<context>atl.general</context>
</web-resource>

<!-- macro that is placed on some pages -->
<xhtml-macro name="example-plugin-macro" class="at.example.confluence.exampleplugin.macro.ExamplePluginMacro" key="example-plugin-macro"
icon="/download/resources/${project.groupId}.${project.artifactId}/images/macro.png"
>
<parameters>
<parameter name="defaulttitle" type="string">
<option key="showNameInPlaceholder" value="false" />
<option key="showValueInPlaceholder" value="true" />
</parameter>
<parameter name="defaultcolor" type="string">
<option key="showNameInPlaceholder" value="false" />
<option key="showValueInPlaceholder" value="false" />
</parameter>
<parameter name="state" type="string" default="">
<option key="showNameInPlaceholder" value="false" />
<option key="showValueInPlaceholder" value="false" />
</parameter>
<parameter name="layout" type="enum" default="">
<option key="showNameInPlaceholder" value="false" />
<option key="showValueInPlaceholder" value="false" />
<value name="subtle" />
<value name="prominent" />
</parameter>
</parameters>
<description key="at.example.confluence.exampleplugin.example-plugin.example-plugin-macro.desc" />
</xhtml-macro>

<!-- action that is called via ajax by the frontend-code the macro renders -->
<xwork name="example-plugin-xwork" key="example-plugin-xwork">
<description key="example-plugin-xwork.link.desc">Some action called by JavaScript.</description>
<package name="example-plugin" extends="default" namespace="/plugins/example-plugin">
<default-interceptor-ref name="defaultStack"/>
<action name="do-action" class="at.example.confluence.exampleplugin.ExamplePluginAction">
<result name="success" type="redirect">${page.urlPath}</result>
<result name="json" type="json" />
</action>
</package>
</xwork>

<!-- administration servlet for manual actions -->
<servlet key="manual-exampleplugin-update" i18n-name-key="at.example.confluence.exampleplugin.servlet" class="at.example.confluence.exampleplugin.servlet.UpdateServlet">
<url-pattern>/updateExamplePluginMacros</url-pattern>
</servlet>

</atlassian-plugin>
Minh Tran Atlassian Team Apr 09, 2018

Ohh you are using atlassian-spring-scanner 2.1.0. Have you upgraded it recently too?

Matthias Steinböck Apr 09, 2018

Yes it is possible that the problem exists since the upgrade. But i have no evidence to support this. Did you have Problems with 2+? Did you switch back to an older one?

Minh Tran Atlassian Team Apr 09, 2018

@Matthias Steinböck You can follow the guideline here to upgrade your plugin to be compatible https://bitbucket.org/atlassian/atlassian-spring-scanner

Matthias Steinböck Apr 09, 2018

@Minh Tran i followed the guide to the point.

I don't see any errors in my pom.xml or plugin-context.xml. Here it is for verification:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:atlassian-scanner="http://www.atlassian.com/schema/atlassian-scanner/2"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.atlassian.com/schema/atlassian-scanner/2
http://www.atlassian.com/schema/atlassian-scanner/2/atlassian-scanner.xsd">

<!-- This file is loaded at plugin boot time, and loads all the components that don't have @Profile set.
See also dynamic-spring-scanner.xml for loading of those that have @Profile("dynamic"). -->

<atlassian-scanner:scan-indexes />

</beans>

 

So I already followed that guide. I also found the source code which is emitting this exception: https://bitbucket.org/atlassian/atlassian-spring-scanner/src/37f7d28a6e20e261dd878e83697e2411fbf93c74/atlassian-spring-scanner-runtime/src/main/java/com/atlassian/plugin/spring/scanner/runtime/impl/AtlassianScannerBeanDefinitionParser.java?at=atlassian-spring-scanner-parent-2.1.3&fileviewer=file-view-default#AtlassianScannerBeanDefinitionParser.java-180

But i have no clue why it is thrown.

Sylvain Laurent Jul 02, 2018

Did you find a solution to this issue?

I have a bitbucket plugin which worked fine until recently but now I have been told that some 5.11 BB installations suffer from the same issue as you with my plugin. I don't understand why...

Matthias Steinböck Jul 02, 2018

Hey @Sylvain Laurent do you use atlassian spring scanner 2 or 1? we think this is the problem. We downgraded and are currently testing it.

Sylvain Laurent Jul 04, 2018

@Matthias Steinböck I'm using version 2.1.3.

I've check my plugin, it does not contain any spring scanner jars. I just have the import in the MANIFEST.MF which seems correct.

I really don't understand what's going on

Sylvain Laurent Jul 04, 2018

@Minh Tran could the error come from this problem https://jira.atlassian.com/browse/CONFSERVER-55916 ? it seems a good candidate!

Suggest an answer

Log in or Sign up to answer
This widget could not be displayed.
This widget could not be displayed.
Community showcase
Published in Confluence

6 Awesome Ways to Apply Trello, JIRA and Confluence to your Project

I attended  Atlassian Summit 2019  and learned a lot from the presenters, attendees and knowledgeable Atlassian product managers. The presentations I attended focused on applying Agile, pla...

1,028 views 7 17
Read article

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you