J'ai généré une application Web Spring Boot à l'aide de Spring Initializer, intégrant Tomcat, moteur de modèle Thymeleaf. Technologies utilisées: Spring Boot 1.4.2.RELEASE, Spring 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, Tomcat Intégré 8.5.6, Maven 3, Java 8
J'ai une application SpringBoot. avec ces 2 classes:
@Profile("!war")
@SpringBootApplication
@Import({SecurityConfig.class ,PersistenceConfig.class, ServiceConfig.class})
public class BookApplication {
public static void main(String[] args) {
SpringApplication.run(BookApplication.class, args);
}
}
@Profile("war")
@Import({SecurityConfig.class ,PersistenceConfig.class})
@SpringBootApplication
public class BookApplicationWar extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BookApplicationWar.class);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(BookApplicationWar.class, args);
}
}
Je génère la guerre avec cette commande
mvn clean package -DskipTests -Dspring.profiles.active=pebloc,war -DAPP-KEY=pebloc
Mais j'ai eu cette erreur:
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar] -> [Help 1]
Si vous avez plusieurs classes principales, vous devez explicitement configurer la classe principale dans chaque profil:
<profiles>
<profile>
<id>profile1</id>
<properties>
<spring.boot.mainclass>com.SomeClass</spring.boot.mainclass>
</properties>
</profile>
<profile>
<id>profile2</id>
<properties>
<spring.boot.mainclass>com.SomeOtherClass</spring.boot.mainclass>
</properties>
</profile>
</profiles>
...
<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>
<configuration>
<mainClass>${spring.boot.mainclass}</mainClass>
</configuration>
</execution>
</executions>
...
</plugin>
ou simplement coder en dur la classe principale dans la configuration du plugin.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>your.main.class.MainClass</mainClass>
</configuration>
</execution>
</executions>
</plugin>
Parfois, cette erreur se produit lorsque vous effectuez une installation MVN sans effectuer le nettoyage MVN.
[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage (default) on project book: Execution default of goal org.springframework.boot:spring-boot-maven-plugin:1.5.2.RELEASE:repackage failed: Unable to find a single main class from the following candidates [com.tdk.BookApplication, com.tdk.BookApplicationWar]
L'une des raisons possibles de l'erreur suivante est qu'il existe plusieurs méthodes principales dans votre code. Spring Boot n'autorise qu'une méthode principale dans toutes les classes du même projet.
Définir une seule classe principale via la propriété start-class
<properties>
<start-class>com.may.Application</start-class>
</properties>
Vous pouvez également définir la classe principale dans le plug-in spring-boot-maven
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.may.Application</mainClass>
</configuration>
</plugin>
</plugins>
</build>
J'ai eu la même erreur. J'avais renommé ma classe Application contenant main de foo.Java en bar.Java, nettoyé et mis à jour. Donc, je n'ai jamais eu qu'une seule main.
L'erreur a disparu lorsque j'ai supprimé l'ancienne classe générée, foo.class, dans le dossier cible.
Vérifiez votre application si vous avez plusieurs classes avec public static void main(String[] args)
. Supprimez celui dont vous n'avez pas besoin. Spécialement si vous générez le projet avec https://start.spring.io/
, il est livré avec une classe contenant la méthode main.
Si vous avez besoin de toutes les classes avec la méthode main, indiquez explicitement celle qui sera piégée au démarrage de l’application en le mentionnant dans le pom.