SingleWar deployment: ConflictingBeanDefinitionException #165

hi,

when i try to create a single war deployment, i get a nasty error regarding “cuba_ConfigStorageMBean” which seem to result due to the two beans: com.haulmont.cuba.core.jmx.ConfigStorag and com.haulmont.cuba.web.jmx.ConfigStorage when starting up the tomcat.


11:27:14.784 ERROR c.h.cuba.web.sys.WebAppContextLoader - Error initializing application
org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [cuba-web-spring.xml]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'cuba_ConfigStorageMBean' for bean class [com.haulmont.cuba.core.jmx.ConfigStorage] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.cuba.web.jmx.ConfigStorage]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:604) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:509) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at com.haulmont.cuba.core.sys.CubaClassPathXmlApplicationContext.<init>(CubaClassPathXmlApplicationContext.java:19) ~[cuba-global-6.0.8.jar:6.0.8]
	at com.haulmont.cuba.core.sys.AbstractAppContextLoader.createClassPathXmlApplicationContext(AbstractAppContextLoader.java:66) ~[cuba-global-6.0.8.jar:6.0.8]
	at com.haulmont.cuba.core.sys.AbstractAppContextLoader.initAppContext(AbstractAppContextLoader.java:43) ~[cuba-global-6.0.8.jar:6.0.8]
	at com.haulmont.cuba.core.sys.AbstractWebAppContextLoader.contextInitialized(AbstractWebAppContextLoader.java:53) ~[cuba-global-6.0.8.jar:6.0.8]
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4793) [catalina.jar:8.0.29]
	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5236) [catalina.jar:8.0.29]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.29]
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) [catalina.jar:8.0.29]
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) [catalina.jar:8.0.29]
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) [catalina.jar:8.0.29]
	at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) [catalina.jar:8.0.29]
	at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1795) [catalina.jar:8.0.29]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_66-internal]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_66-internal]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_66-internal]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_66-internal]
	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_66-internal]
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'cuba_ConfigStorageMBean' for bean class [com.haulmont.cuba.core.jmx.ConfigStorage] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.cuba.web.jmx.ConfigStorage]
	at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:87) ~[spring-context-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:168) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:138) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392) ~[spring-beans-4.2.0.RELEASE.jar:4.2.0.RELEASE]
	... 30 common frames omitted
08-Mar-2016 11:27:14.785 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file

The gradle command i used for war creation is:

task buildWar(type: CubaWarBuilding) {
    appHome = '..'
    appProperties = ['cuba.automaticDatabaseUpdate': 'true']
    singleWar = true
}

I kind of know why this is happening, but i’m not really sure how to resolve it. Can anyone give me a hint? Thx.

Bye,
Mario

When you create single WAR, you have to provide a special web.xml file as described here: https://doc.cuba-platform.com/manual-6.0/build.gradle_buildWar.html
So the task definition should be like this:


task buildWar(type: CubaWarBuilding) {
    appHome = '..'
    webXml = "${webModule.projectDir}/web/WEB-INF/single-war-web.xml"
}

The example of web.xml is provided in the documentation.

hi,

hmm… i already read about that but forgot to create it. Thanks for the hint. The problem is, it didn’t change anything on the error side.

Here’s my modules/web/WEB_INF/singe-war-web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">

    <!-- Web Client parameters -->

    <context-param>
        <description>List of app properties files for Web Client</description>
        <param-name>appPropertiesConfigWeb</param-name>
        <param-value>
            classpath:cuba-web-app.properties
            classpath:web-app.properties
            /WEB-INF/local.app.properties
        </param-value>
    </context-param>
    <context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <description>Web resources version for correct caching in browser</description>
        <param-name>webResourcesTs</param-name>
        <param-value>${webResourcesTs}</param-value>
    </context-param>
    <context-param>
        <description>Web client UI class</description>
        <param-name>UI</param-name>
        <param-value>com.haulmont.cuba.web.AppUI</param-value>
    </context-param>
    <context-param>
        <description>Web Client UIProvider class</description>
        <param-name>UIProvider</param-name>
        <param-value>com.haulmont.cuba.web.sys.CubaUIProvider</param-value>
    </context-param>
    <context-param>
        <description>Web Client Application class</description>
        <param-name>application</param-name>
        <param-value>com.company.ordermanagement.web.App</param-value>
    </context-param>
    <context-param>
        <description>Web Client Widgetset name</description>
        <param-name>widgetset</param-name>
        <param-value>com.haulmont.cuba.web.toolkit.ui.WidgetSet</param-value>
    </context-param>

    <!-- Middleware parameters -->

    <context-param>
        <description>List of app properties files for Middleware</description>
        <param-name>appPropertiesConfigCore</param-name>
        <param-value>
            classpath:cuba-app.properties
            classpath:app.properties
            /WEB-INF/local.app.properties
        </param-value>
    </context-param>

    <!-- Servlet context listeners that load the application blocks -->

    <listener>
        <listener-class>com.haulmont.cuba.core.sys.singleapp.SingleAppCoreServletListener</listener-class>
    </listener>
    <listener>
        <listener-class>com.haulmont.cuba.web.sys.singleapp.SingleAppWebServletListener</listener-class>
    </listener>
</web-app>

the gradle task:

task buildWar(type: CubaWarBuilding) {
    appHome = '..'
    appProperties = ['cuba.automaticDatabaseUpdate': 'true']
    webXml = "${webModule.projectDir}/web/WEB-INF/single-war-web.xml"
}

The error stays the same:

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'cuba_ConfigStorageMBean' for bean class [com.haulmont.cuba.core.jmx.ConfigStorage] conflicts with existing, non-compatible bean definition of same name and class [com.haulmont.cuba.web.jmx.ConfigStorage]

Could you check whether the provided single-war-web.xml is actually packed into WAR as WEB-INF/web.xml?

the in the war/WEB_INF/web.xml looks like this:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
    <context-param>
        <description>Vaadin production mode</description>
        <param-name>productionMode</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <description>Web resources version for correct caching in browser</description>
        <param-name>webResourcesTs</param-name>
        <param-value>2016_03_08_16_07</param-value>
    </context-param>
    <!-- Application properties config files -->
    <context-param>
        <param-name>appPropertiesConfig</param-name>
        <param-value>
            classpath:cuba-web-app.properties
            classpath:web-app.properties
            /WEB-INF/local.app.properties
            "file:${catalina.home}/conf/app/local.app.properties"
        </param-value>
    </context-param>
    <listener>
        <listener-class>com.haulmont.cuba.web.sys.WebAppContextLoader</listener-class>
    </listener>
    <servlet>
        <servlet-name>app_servlet</servlet-name>
        <servlet-class>com.haulmont.cuba.web.sys.CubaApplicationServlet</servlet-class>
        <init-param>
            <description>Application class</description>
            <param-name>application</param-name>
            <param-value>com.company.ordermanagement.web.App</param-value>
        </init-param>
        <init-param>
            <description>Widgetset name</description>
            <param-name>widgetset</param-name>
            <param-value>com.haulmont.cuba.web.toolkit.ui.WidgetSet</param-value>
        </init-param>
        <init-param>
            <description>UI class</description>
            <param-name>UI</param-name>
            <param-value>com.haulmont.cuba.web.AppUI</param-value>
        </init-param>
        <init-param>
            <description>UIProvider class</description>
            <param-name>UIProvider</param-name>
            <param-value>com.haulmont.cuba.web.sys.CubaUIProvider</param-value>
        </init-param>
        <init-param>
            <description>Heartbeat of active UI in seconds</description>
            <param-name>heartbeatInterval</param-name>
            <param-value>30</param-value>
        </init-param>
    </servlet>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>com.haulmont.cuba.web.sys.CubaDispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/dispatch/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>app_servlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>cuba_filter</filter-name>
        <filter-class>com.haulmont.cuba.web.sys.CubaHttpFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>cuba_filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

It pretty much looks like the single-war-web.xml and not like the original web.xml. So i would say, yes it is packed into the war file.

Well, I would say exactly opposite - the web.xml that you listed in your last comment looks like the original web.xml and not as single-war-web.xml :slight_smile:
Look at them again please.

:smiley: ok, you got me. i worked the whole time in the core directory with the xml files… copying it to web module did the trick. Thx!!