'Getting java.lang.NoSuchMethodError: org.yaml.snakeyaml.Yaml.<init> while running spark based spring boot application

SnakeYaml jar present at classPath: snakeyaml-1.26.jar

2330 [main] ERROR org.springframework.boot.SpringApplication  - Application run failed
java.lang.NoSuchMethodError: org.yaml.snakeyaml.Yaml.<init>(Lorg/yaml/snakeyaml/constructor/BaseConstructor;Lorg/yaml/snakeyaml/representer/Representer;Lorg/yaml/snakeyaml/DumperOptions;Lorg/yaml/snakeyaml/LoaderOptions;Lorg/yaml/snakeyaml/resolver/Resolver;)V
    at org.springframework.boot.env.OriginTrackedYamlLoader.createYaml(OriginTrackedYamlLoader.java:71)
    at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:162)
    at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:76)
    at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50)
    at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:607)


Solution 1:[1]

I had a similar problem and my solution was to use snakeyaml in the exact same version as spring boot does.

In general a good trick is to import maven dependencies from org.springframework.boot:spring-boot-dependencies in order to avoid version incompatibilities.

If you're using mvn, add this under <dependencyManagement> in your pom:

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring.boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

and then this under <dependencies>:

    <dependency>
      <groupId>org.yaml</groupId>
      <artifactId>snakeyaml</artifactId>
      <scope>runtime</scope>
    </dependency>

For example spring-boot-dependencies-2.3.6.RELEASE.pom uses snakeyaml in 1.26:

 <snakeyaml.version>1.26</snakeyaml.version>

Whereas spring-boot-dependencies-2.5.12.pom uses 1.28:

 <snakeyaml.version>1.28</snakeyaml.version>

And spring-boot-dependencies-2.6.1.pom uses 1.29:

 <snakeyaml.version>1.29</snakeyaml.version>

Hope this helps.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Alexander