J'ai un projet de démarrage printanier que je peux exécuter avec succès depuis IntelliJ, mais lorsque je compresse un fichier jar exécutable, je ne peux plus l'exécuter. Voici la trace de la pile de l'exception:
18:13:55.254 [main] INFO o.s.c.a.AnnotationConfigApplicationContext - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@b3d7190: startup date [Wed Sep 07 18:13:55 CEST 2016]; root of context hierarchy
18:13:55.403 [main] WARN o.s.c.a.AnnotationConfigApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [el.dorado.App]; 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.
18:13:55.414 [main] ERROR o.s.boot.SpringApplication - Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [el.dorado.App]; 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.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 dz.lab.jpmtask.App.main(App.Java:33)
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)
... 13 common frames omitted
Ma configuration est quelque chose comme:
@Configuration
@EnableAutoConfiguration
public class AppConfig {
... some beans
}
J'ai ajouté META-INF/spring.factories
dans le dossier des ressources du projet comme décrit dans 43.2 Localisation des candidats à la configuration automatique comme suit Mais ceci n'a pas résolu le problème:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
el.dorado.AppConfig
Voici le projet pom.xml
:
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>el.dorado</groupId>
<artifactId>ElDorado</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>ElDorado</name>
<url>http://maven.Apache.org</url>
<properties>
<junit.version>4.12</junit.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>el.dorado.App</mainClass>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-Assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<!--<version>0.7.8-SNAPSHOT</version>-->
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Je viens de le comprendre, j'aurais dû utiliser plugin Spring Boot maven à la place. Maintenant, la section de construction de mon pom.xml
ressemble à ceci:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>dz.lab.jpmtask.App</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<!--<version>0.7.8-SNAPSHOT</version>-->
<executions>
<execution>
<id>jacoco-initialize</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>jacoco-site</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Je construis le projet avec mvn clean package
et ensuite Java -jar target/myproject.jar
et cela fonctionne comme un charme.
Je pense que vous avez oublié d’utiliser Annotation dans votre AppConfig.
Ajouter trois annotations comme
@Configuration
@EnableWebMvc
@ComponentScan("Scan_Package_Name")
public class AppConfig {
... some beans
}
Je l'ai résolu comme suit:
Je suis passé de mvn clean compile Assembly:single
À mvn clean package
Et l'erreur a disparu.
J'ai aussi eu le
Échec du traitement des candidats d'importation pour la classe de configuration [...]; L'exception imbriquée est Java.lang.IllegalStateException: impossible de lire les métadonnées pour la classe ...
erreur due à une faute de frappe dans mon fichier spring.factories
. Dans ce cas, l’exception racine était
la ressource de chemin de classe [...] ne peut pas être ouverte car elle n'existe pas.
C'est un point important à vérifier car il ne peut pas être validé au moment de la compilation.