Spring Error on Plugin Enable when including `org.jetbrains.teamcity.internal server` dependency

I am writing a plugin that uses the SBuildPromotionEx interface provided by the `org.jetbrains.teamcity.internal server` dependency to add custom parameters before build start.  Prior to adding this dependency, my plugin worked fine. After including it and uploading the new zip, I get the below error text.  

org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from URL [jar:file:/opt/teamcity/webapps/ROOT/WEB-INF/lib/common-impl.jar!/META-INF/per-plugin-shared-spring.xml]; nested exception is org.springframework.beans.FatalBeanException: Class [org.springframework.context.config.ContextNamespaceHandler] for namespace [http://www.springframework.org/schema/context] does not implement the [org.springframework.beans.factory.xml.NamespaceHandler] interface
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:417)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:338)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:310)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:196)
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:232)
at jetbrains.buildServer.plugins.spring.SpringPluginLoader$TeamCityPluginContext.doLoadBeanDefinitions(SpringPluginLoader.java:316)
at jetbrains.buildServer.plugins.spring.SpringPluginLoader$TeamCityPluginContext.loadBeanDefinitions(SpringPluginLoader.java:302)
at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:95)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:679)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:562)
at jetbrains.buildServer.plugins.spring.SpringPluginLoader.pluginClassesLoaded(SpringPluginLoader.java:126)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at jetbrains.buildServer.util.EventDispatcher.invokeListeners(EventDispatcher.java:157)
at jetbrains.buildServer.util.EventDispatcher.dispatch(EventDispatcher.java:136)
at jetbrains.buildServer.util.EventDispatcher$2.invoke(EventDispatcher.java:82)
at jdk.proxy3/jdk.proxy3.$Proxy51.pluginClassesLoaded(Unknown Source)
at jetbrains.buildServer.plugins.PluginManagerImpl$5.visitPlugin(PluginManagerImpl.java:470)
at jetbrains.buildServer.plugins.PluginsCollection$1.run(PluginsCollection.java:98)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
at java.base/java.lang.Thread.run(Thread.java:1583)
Caused by: org.springframework.beans.FatalBeanException: Class [org.springframework.context.config.ContextNamespaceHandler] for namespace [http://www.springframework.org/schema/context] does not implement the [org.springframework.beans.factory.xml.NamespaceHandler] interface
at org.springframework.beans.factory.xml.DefaultNamespaceHandlerResolver.resolve(DefaultNamespaceHandlerResolver.java:132)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1386)
at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1371)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:179)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:149)
at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:96)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:511)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:391)
... 24 more

Here is my plugin xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
       default-autowire="constructor">
    <bean class="package.class1" />
    <bean class="package.class2"/>
    <bean class="package.class3"/>
</beans>

and the dependencies from my pom.xml

        <dependency>
          <groupId>org.jetbrains.teamcity</groupId>
          <artifactId>server-api</artifactId>
          <version>${teamcity-version}</version>
          <scope>provided</scope>
        </dependency>

        <dependency>
          <groupId>org.jetbrains.teamcity</groupId>
          <artifactId>server-web-api</artifactId>
          <version>${teamcity-version}</version>
          <type>war</type>
          <scope>provided</scope>
        </dependency>

        <dependency>
          <groupId>org.jetbrains.teamcity</groupId>
          <artifactId>tests-support</artifactId>
          <version>${teamcity-version}</version>
          <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.jetbrains.teamcity.internal</groupId>
            <artifactId>server</artifactId>
            <version>${teamcity-version}</version>
            <scope>compile</scope>
        </dependency>

I tried this on both Teamcity 2024 and 2025, and the results were the same. I also verified that I'm using the same version of spring in the plugin as my Teamcity instance. I know the SBuildPromotionEx interface can be used in plugins--we have another similar plugin that I can load just fine. I can't tell what about my plugin configuration might be causing issues when including this dependency.

0
1 comment

I was able to apply the dependency  and load the plugin by changing the dependency's scope to “provided”

0

Please sign in to leave a comment.