Getting Caused by: java.lang.NoClassDefFoundError: io/camunda/connector/api/secret/SecretProvider exception while running the outbound connector using springboot runtime

Why does @SpringBootApplication work when LocalRuntimeConnector.java is in the test package but fails when moved to src/main/java? How can I resolve the NoClassDefFoundError related to SecretProvider?

Exception in thread "main" java.lang.IllegalStateException: Error processing condition on io.camunda.connector.runtime.OutboundConnectorsAutoConfiguration.feelEngine
	at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:60)
	at org.springframework.context.annotation.ConditionEvaluator.shouldSkip(ConditionEvaluator.java:108)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:183)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144)
	at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:428)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:289)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:349)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:118)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:788)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:606)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:334)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343)
	at io.camunda.example.LocalConnectorRuntime.main(LocalConnectorRuntime.java:11)
Caused by: java.lang.IllegalStateException: Failed to introspect Class [io.camunda.connector.runtime.outbound.OutboundConnectorRuntimeConfiguration] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@76ed5528]
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:483)
	at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:360)
	at org.springframework.util.ReflectionUtils.getUniqueDeclaredMethods(ReflectionUtils.java:417)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.lambda$getTypeForFactoryMethod$1(AbstractAutowireCapableBeanFactory.java:750)
	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1742)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryMethod(AbstractAutowireCapableBeanFactory.java:749)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineTargetType(AbstractAutowireCapableBeanFactory.java:682)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.predictBeanType(AbstractAutowireCapableBeanFactory.java:653)
	at org.springframework.beans.factory.support.AbstractBeanFactory.isFactoryBean(AbstractBeanFactory.java:1645)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doGetBeanNamesForType(DefaultListableBeanFactory.java:562)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:534)
	at org.springframework.boot.autoconfigure.condition.OnBeanCondition.collectBeanNamesForType(OnBeanCondition.java:247)
	at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:240)
	at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getBeanNamesForType(OnBeanCondition.java:230)
	at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchingBeans(OnBeanCondition.java:183)
	at org.springframework.boot.autoconfigure.condition.OnBeanCondition.getMatchOutcome(OnBeanCondition.java:158)
	at org.springframework.boot.autoconfigure.condition.SpringBootCondition.matches(SpringBootCondition.java:47)
	... 17 more
Caused by: java.lang.NoClassDefFoundError: io/camunda/connector/api/secret/SecretProvider
	at java.base/java.lang.ClassLoader.defineClass1(Native Method)
	at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1023)
	at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:150)
	at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:862)
	at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:760)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:681)
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:639)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
	at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3601)
	at java.base/java.lang.Class.getDeclaredMethods(Class.java:2686)
	at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:465)
	... 33 more
Caused by: java.lang.ClassNotFoundException: io.camunda.connector.api.secret.SecretProvider
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	... 46 more

@Shivansh_pandey This is probably due to the dependencies which are only declared in test scope

@sbuettner

I have already removed the the test scope, still i face the same.
But when i move the local runtime to the test folder, It works.

My pom


4.0.0

connector-template
Camunda Connector Template
io.camunda.connector
connector-template
jar
0.1.0-SNAPSHOT

17 UTF-8 UTF-8
<!-- connector SDK version -->
<version.connectors>8.3.1</version.connectors>

<!-- external libraries -->
<version.assertj>3.24.2</version.assertj>
<version.junit-jupiter>5.10.1</version.junit-jupiter>
<version.mockito>5.7.0</version.mockito>
<version.slf4j>2.0.9</version.slf4j>

<!-- maven plugins -->
<plugin.version.maven-clean-plugin>3.3.2</plugin.version.maven-clean-plugin>
<plugin.version.maven-compiler-plugin>3.11.0</plugin.version.maven-compiler-plugin>
<plugin.version.maven-dependency-plugin>3.6.1</plugin.version.maven-dependency-plugin>
<plugin.version.maven-install-plugin>3.1.1</plugin.version.maven-install-plugin>
<plugin.version.maven-jar-plugin>3.3.0</plugin.version.maven-jar-plugin>
<plugin.version.maven-resources-plugin>3.3.1</plugin.version.maven-resources-plugin>
<plugin.version.maven-shade-plugin>3.5.1</plugin.version.maven-shade-plugin>
<plugin.version.maven-surefire-plugin>3.2.2</plugin.version.maven-surefire-plugin>
io.camunda.connector connector-core ${version.connectors} provided io.camunda.connector connector-validation ${version.connectors} provided org.slf4j slf4j-api ${version.slf4j}
<!-- Element template generator annotations (compile-time only) -->
<dependency>
  <groupId>io.camunda.connector</groupId>
  <artifactId>element-template-generator-core</artifactId>
  <version>${version.connectors}</version>
  <optional>true</optional>
</dependency>

<!-- test dependencies -->
<dependency>
  <groupId>io.camunda.connector</groupId>
  <artifactId>connector-test</artifactId>
  <version>${version.connectors}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter</artifactId>
  <version>${version.junit-jupiter}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-junit-jupiter</artifactId>
  <version>${version.mockito}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.assertj</groupId>
  <artifactId>assertj-core</artifactId>
  <version>${version.assertj}</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-jdk14</artifactId>
  <version>${version.slf4j}</version>
  <scope>test</scope>
</dependency>

<!-- for testing connectors locally in bundle with runtime -->
<dependency>
  <groupId>io.camunda.connector</groupId>
  <artifactId>spring-boot-starter-camunda-connectors</artifactId>
  <version>${version.connectors}</version>
  <exclusions>
    <exclusion>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
    </exclusion>
  </exclusions>
</dependency>
org.apache.maven.plugins maven-clean-plugin ${plugin.version.maven-clean-plugin} org.apache.maven.plugins maven-dependency-plugin ${plugin.version.maven-dependency-plugin} org.apache.maven.plugins maven-resources-plugin ${plugin.version.maven-resources-plugin} org.apache.maven.plugins maven-compiler-plugin ${plugin.version.maven-compiler-plugin} org.apache.maven.plugins maven-jar-plugin ${plugin.version.maven-jar-plugin} false org.apache.maven.plugins maven-install-plugin ${plugin.version.maven-install-plugin} org.apache.maven.plugins maven-shade-plugin ${plugin.version.maven-shade-plugin} true with-dependencies false *:* module-info.class META-INF/MANIFEST.MF META-INF/*.SF META-INF/*.DSA META-INF/*.RSA false package shade io.camunda.connector element-template-generator-maven-plugin ${version.connectors} generate-templates org.apache.maven.plugins maven-surefire-plugin ${plugin.version.maven-surefire-plugin}
<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
  </plugin>
   <plugin>
     <groupId>io.camunda.connector</groupId>
     <artifactId>element-template-generator-maven-plugin</artifactId>
     <configuration>
       <connectorClasses>
         <connectorClass>io.camunda.example.MyConnectorFunction</connectorClass>
       </connectorClasses>
     </configuration>
   </plugin>
</plugins>
true false connectors Connectors Repository https://artifacts.camunda.com/artifactory/connectors/
<repository>
  <releases>
    <enabled>false</enabled>
  </releases>
  <snapshots>
    <enabled>true</enabled>
  </snapshots>
  <id>connectors-snapshots</id>
  <name>Connectors Snapshot Repository</name>
  <url>https://artifacts.camunda.com/artifactory/connectors-snapshots/</url>
</repository>
connectors Connectors Repository https://artifacts.camunda.com/artifactory/connectors/
<pluginRepository>
  <id>connectors-snapshots</id>
  <name>Connectors Snapshot Repository</name>
  <url>https://artifacts.camunda.com/artifactory/connectors-snapshots/</url>
</pluginRepository>

@jonathan.lukas do you have any idea on my issue?

Fixed!

  • Moved the main class to the main package.
  • Removed the scope from all the non test dependencies.
  • Added commons logging exclusion to the springboot starter camunda dependency, It worked!
 <dependency>
      <groupId>io.camunda.connector</groupId>
      <artifactId>spring-boot-starter-camunda-connectors</artifactId>
      <version>${version.connectors}</version>
      <exclusions>
        <exclusion>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
        </exclusion>
      </exclusions>
    </dependency>