Home > other >  Sbt Spring boot No auto configuration classes found in META-INF/spring.factories
Sbt Spring boot No auto configuration classes found in META-INF/spring.factories

Time:10-04

after upgrading from Spring boot 2.4.13 to 2.7.4 I started facing this error on my containerized Scala application (I am using scala 2.12)

java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you are using a custom packaging, make sure that file is correct.
    at org.springframework.util.Assert.notEmpty(Assert.java:470)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getCandidateConfigurations(AutoConfigurationImportSelector.java:185)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.getAutoConfigurationEntry(AutoConfigurationImportSelector.java:125)
    at org.springframework.boot.autoconfigure.AutoConfigurationImportSelector$AutoConfigurationGroup.process(AutoConfigurationImportSelector.java:440)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGrouping.getImports(ConfigurationClassParser.java:879)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorGroupingHandler.processGroupImports(ConfigurationClassParser.java:809)
    at org.springframework.context.annotation.ConfigurationClassParser$DeferredImportSelectorHandler.process(ConfigurationClassParser.java:780)
    at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:192)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
    at com.eb.data.batch.writer.TermSuccessBatchMainClass$.main(TermSuccessBatch.scala:61)
    at com.eb.data.batch.writer.TermSuccessBatchMainClass.main(TermSuccessBatch.scala)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.base/java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.spark.deploy.JavaMainApplication.start(SparkApplication.scala:52)
    at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:958)
    at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:203)
    at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:90)
    at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:1046)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:1055)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

After making some research, I found possible solutions like including one of these plugins on plugins.sbt file:

addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.9.2")
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.9.11")
addSbtPlugin("org.springframework.boot" % "spring-boot-maven-plugin" % "2.7.4")

However, I am not able to resolve the last 2 of these plugins, but the file contains other plugins that are properly resolved si I discarded a repository configuration problem. Indeed, the first one can be resolved but didn't fix the issue. I also appended this line to build.sbt:

enablePlugins(JavaAppPackaging)
[error] (update) sbt.librarymanagement.ResolveException: Error downloading com.typesafe.sbt:sbt-native-packager;sbtVersion=1.0;scalaVersion=2.12:1.9.11
[error]   Not found
[error]   Not found
[error]   not found: https://repo1.maven.org/maven2/com/typesafe/sbt/sbt-native-packager_2.12_1.0/1.9.11/sbt-native-packager-1.9.11.pom
[error]   not found: /Users/myuser/.ivy2/localcom.typesafe.sbt/sbt-native-packager/scala_2.12/sbt_1.0/1.9.11/ivys/ivy.xml
[error]   unauthorized: https://my-nexus-server/repository/ivy-releases-group/com.typesafe.sbt/sbt-native-packager/scala_2.12/sbt_1.0/1.9.11/ivys/artifact.xml (Sonatype Nexus Repository Manager)
[error]   unauthorized: https://my-nexus-server/repository/public/com/typesafe/sbt/sbt-native-packager_2.12_1.0/1.9.11/sbt-native-packager-1.9.11.pom (Sonatype Nexus Repository Manager)
[error]   not found: https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.typesafe.sbt/sbt-native-packager/scala_2.12/sbt_1.0/1.9.11/ivys/ivy.xml
[error]   not found: https://repo.typesafe.com/typesafe/ivy-releases/com.typesafe.sbt/sbt-native-packager/scala_2.12/sbt_1.0/1.9.11/ivys/ivy.xml

The last two are throwing an unauthorized error on my nexus repository but .sbt credentials are properly set and it is able to resolve any dependencies an other plugins through the nexus server (I guess it is a Not found instead).

Also tried to modify the merge strategy from

lazy val assemblySettings = Seq(
  assembly / assemblyMergeStrategy := {
    case PathList("META-INF", "spring.factories") => MergeStrategy.filterDistinctLines
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case _                             => MergeStrategy.first
  }
)

to

lazy val assemblySettings = Seq(
  assembly / assemblyMergeStrategy := {
    case PathList("META-INF", "spring.factories") => MergeStrategy.filterDistinctLines
    case PathList("META-INF", "spring") => MergeStrategy.filterDistinctLines
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case _                             => MergeStrategy.first
  }
)

since the autoconfiguration seems to have been moved on spring boot 2.7 and the error message says it is tried to locate it also under META-INF/spring It didn't work

Any ideas to face this issue?

CodePudding user response:

Since the spring auto configuration settings have been moved on spring 2.7 from META-INF/spring.factories to META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports, replacing this path on the merge strategy for sbt build worked:

  assembly / assemblyMergeStrategy := {
    case PathList("META-INF", "spring.factories") => MergeStrategy.filterDistinctLines
    case PathList("META-INF", "spring", "org.springframework.boot.autoconfigure.AutoConfiguration.imports") => MergeStrategy.filterDistinctLines
    case PathList("META-INF", xs @ _*) => MergeStrategy.discard
    case _                             => MergeStrategy.first
  }
  • Related