web-dev-qa-db-fra.com

Spring Boot: impossible de trouver une seule classe principale parmi les candidats suivants

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]
10

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>

Voir spring-boot: remballer

21
Sean Patrick Floyd

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>
6
Sheikh Abdul Wahid

Parfois, cette erreur se produit lorsque vous effectuez une installation MVN sans effectuer le nettoyage MVN.

3
yılmaz
[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.

1
vaquar khan

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>
1
Eugene Maysyuk

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.

0
schoon

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. 

0
tadtab