98 votes

SpringBoot - création de fichiers jar - Aucune classe de configuration automatique trouvée dans META-INF/spring.factories

Tout fonctionnait bien au démarrage de mon application en utilisant IntelliJ . Mais quand j'ai fait un gros pot et l'ai exécuté avec

java -jar myapp.jar

J'ai eu ça :

16:37:44.194 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [pl.mypackage.Main]; nested exception is java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
        at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:489)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174)
        at pl.mypackage.Main.main(Main.java:39)
Caused by: java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
        at org.springframework.util.Assert.notEmpty(Assert.java:276)
        at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.getCandidateConfigurations(EnableAutoConfigurationImportSelector.java:145)
        at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.selectImports(EnableAutoConfigurationImportSelector.java:84)
        at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:481)
        ... 14 common frames omitted
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [pl.mypackage.Main]; nested exception is java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
        at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:489)
        at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321)
        at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
        at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
        at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174)
        at pl.mypackage.Main.main(Main.java:39)
Caused by: java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
        at org.springframework.util.Assert.notEmpty(Assert.java:276)
        at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.getCandidateConfigurations(EnableAutoConfigurationImportSelector.java:145)
        at org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelector.selectImports(EnableAutoConfigurationImportSelector.java:84)
        at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:481)
        ... 14 more

Il semble qu'il ne trouve pas les classes de configuration automatique dans META-INF/spring.factories . Comment l'ajouter, et quel doit être le contenu de ce fichier ?

0 votes

Comment avez-vous fabriqué votre pot de graisse ?

1 votes

J'ai eu le même problème parce que j'ai retiré le spring-boot-starter-parent de mon pom.xml et que je créais le jar en utilisant le plugin d'assemblage comme j'en ai l'habitude. Mea culpa. Utilisation de spring-boot-starter-parent fonctionne comme un charme et trouve automatiquement la classe principale correcte.

76voto

Benoit Larochelle Points 411

J'ai eu le même problème et je viens de le résoudre.

Au début, je générais le bocal de graisse avec la fonction maven-assembly-plugin qui a créé un fichier appelé mavenproject1-0.0.1-SNAPSHOT-jar-with-dependencies.jar . Ce fichier a donné le même problème que vous avez mentionné lorsque j'ai essayé de l'exécuter.

Je pense que parce que c'est une application Spring Boot, vous devez utiliser leur plug-in. J'ai changé mon packaging pour le spring-boot-maven-plugin et il génère deux fichiers : mavenproject1-0.0.1-SNAPSHOT.jar y mavenproject1-0.0.1-SNAPSHOT.jar.original . Essayez juste java -jar target/mavenproject1-0.0.1-SNAPSHOT.jar et j'espère que cela fonctionnera :-)

Pour référence, voici mon pom.xml :

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company</groupId>
    <artifactId>mavenproject1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.0.RELEASE</version>
        <relativePath/>
        <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.company.common</groupId>
            <artifactId>common-files</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies> 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                    <mainClass>${start-class}</mainClass>
                </configuration>
                  <executions>
                    <execution>
                      <goals>
                        <goal>repackage</goal>
                      </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
              <artifactId>maven-assembly-plugin</artifactId>
              <version>2.2-beta-5</version>
              <configuration>
                <archive>
                  <manifest>
                    <addClasspath>true</addClasspath>
                    <mainClass>com.company.mavenproject1.MainClass</mainClass>
                  </manifest>
                </archive>
                <descriptorRefs>
                  <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
              </configuration>
              <executions>
                <execution>
                  <id>assemble-all</id>
                  <phase>package</phase>
                  <goals>
                    <goal>single</goal>
                  </goals>
                </execution>
              </executions>
            </plugin>
        </plugins>
    </build>
</project>

3 votes

Il est important de noter que <packaging>jar</packaging> dans pom.xml est nécessaire. Sans lui, vous pouvez toujours exécuter l'application dans votre IDE, mais le .jar ne fonctionnera pas.

0 votes

Cela a fonctionné pour moi ! J'utilise Spring Boot 2.0

4 votes

Quelle est la commande de construction que vous utilisez après avoir fait ces changements ? mvn clean install ? mvn package ? Ou autre chose ?

14voto

crm86 Points 884

Cette configuration fonctionne pour moi. J'exécute mon JAR comme un service mais la ligne est :

javaw -jar MY_JAR.jar

POM :

<properties>
        <!-- Spring boot main class -->
        <start-class>com.PATH_TO_MAIN.Main</start-class>
</properties>
...
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
</plugin>

Avec Spring Boot, il n'est plus nécessaire d'utiliser le assembly-plugin. N'oubliez pas d'appeler la fonction paquet objectif.

Voici le exemple de documentation .

2 votes

Cela ne semble pas fonctionner si l'application Spring n'est qu'une dépendance de plus dans un autre jar autonome.

14voto

cscan Points 1298

Alternativement, si vous ne pouvez pas utiliser le plugin spring boot pour une raison quelconque, vous pouvez inclure le fichier suivant dans votre application. Il doit s'appeler src/main/resources/META-INF/spring.factories :

https://github.com/spring-projects/spring-boot/blob/1.5.x/spring-boot-autoconfigure/src/main/resources/META-INF/spring.factories

Cela fonctionne pour spring boot 1.x et est utile si vous voulez utiliser des beans gérés par spring dans un REPL.

0 votes

Le fichier n'existe plus.

0 votes

@peterh à partir de quelle version ? Il est présent à partir de la version 1.5.4.

1 votes

Merci @peterh. Il semble qu'ils aient supprimé ce fichier de spring boot 2, j'ai mis à jour la réponse pour refléter cela.

11voto

Muthukumar Points 39

J'ai ajouté cette configuration dans mon pom et le problème a été résolu :

<build>
<plugins>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.2.RELEASE</version>
        <executions>
            <execution>
                <goals>
                    <goal>repackage</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>
</build>

2voto

Satyaprakash Points 141
Caused by: java.lang.IllegalArgumentException: No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.

D'après ce qui précède, il semble que votre conditionnement ne soit pas correctement effectué. Je sais que je suis en retard mais cela pourrait aider quelqu'un d'autre.

Solution

Veuillez vérifier votre @SpringBootApplication La classe devrait avoir un paquet de base au-dessus des autres classes. Par exemple, votre classe @SpringBootApplication est à l'intérieur d'un paquet com.sb.foo alors toutes les autres classes de stéréotypes de printemps doivent être placées à l'intérieur de com.sb.foo.xxx donde xxx peut être n'importe quoi. Il peut s'agir d'un autre sous-ensemble com.sb.foo.xxx.yyy . Il s'agit d'une fonctionnalité de SpringBoot permettant l'auto-configuration. Cette configuration automatique fonctionne bien avec les IDE comme Intellij o Eclipse même si vous avez fait l'erreur.

Les risques de rencontrer ce type de problème seront plus élevés si vous n'utilisez pas d'outil de construction ou d'IDE recommandés tels que STS eclipse pour le développement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X