SpringBoot: Unable to find a single main class from the following candidates

SpringMavenSpring MvcSpring BootSpring Profiles

Spring Problem Overview


I've generated a Spring Boot web application using Spring Initializer, embedded Tomcat, Thymeleaf template engine.Technologies used: Spring Boot 1.4.2.RELEASE, Spring 4.3.4.RELEASE, Thymeleaf 2.1.5.RELEASE, Tomcat Embed 8.5.6, Maven 3, Java 8

I have an SpringBoot app. with these 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);
    }
	
}

I generate the war with this command

 mvn clean package -DskipTests -Dspring.profiles.active=pebloc,war -DAPP-KEY=pebloc

But I got this error:

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

Spring Solutions


Solution 1 - Spring

If you have more than one main class, you need to explicitly configure the main class in each profile:

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

See spring-boot:repackage

Solution 2 - Spring

Define single main class via start-class property

<properties>
      <start-class>com.may.Application</start-class>
</properties>

Alternatively, define the main class in the spring-boot-maven-plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <mainClass>com.may.Application</mainClass>
            </configuration>
        </plugin>
    </plugins>
</build>

Or via profiles

<profiles>
        <profile>
            <id>profile1</id>
            <properties>
                <spring.boot.mainclass>com.may.Application1</spring.boot.mainclass>
            </properties>
        </profile>
        <profile>
            <id>profile2</id>
            <properties>
                <spring.boot.mainclass>com.may.Application2</spring.boot.mainclass>
            </properties>
        </profile>
</profiles>

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                        <configuration>
                            <mainClass>${spring.boot.mainclass}</mainClass>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Solution 3 - Spring

Sometimes this error is given when you do mvn install without doing mvn clean.

Solution 4 - Spring

To disambiguate the entry point of a spring boot application, you can add the following directive to your Gradle build file

springBoot {
    mainClassName = 'your.org.bla.TestKt'
}

Solution 5 - Spring

or simply hard code the main class in plugin configuration.

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

Solution 6 - Spring

From the command line you can use

... -Dstart-class=com.your.package.application.BookApplication

Solution 7 - Spring

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

One possible reason to getting following error is more than one main methods in your code, Spring boot allow only one main method across all class in same project.

Solution 8 - Spring

If you have a Spring Boot Application generally there is only one main class that has @SpringBootApplication , If you add another main method in the application some where , the gradle build process gets confused . So add the following at the root level of your build.gradle file

apply plugin: 'application'
mainClassName = 'packageNameAfter.srcMainJavaFolder.YourClassName'

Solution 9 - Spring

I had the same error. I had renamed my Application class containing main from foo.java to bar.java, cleaned and updated. So I only ever had one main.

The error went away when I deleted the old generated class, foo.class under the target folder.

Solution 10 - Spring

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>your.main.class.MainClass</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Element configuration must be inside the plugin one!

Solution 11 - Spring

Check your application if you have multiple classes with public static void main(String[] args). Remove the one that you do not need. Specially if you generate the project with https://start.spring.io/ it comes with a class with main method in it.

If you do need all of the classes with main method just explicitly mention which one would to be boos-trapped up on application start up by mentioning it in the pom.

Solution 12 - Spring

I was building a spring boot library project, so I don't need a main starter class, so I faced the same issue while building the project with maven, so I removed the maven plugin to compile successfully

<!--
    <build>
      <plugins>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
      </plugins>
    </build>
-->

For a more detailed example. find it here https://spring.io/guides/gs/multi-module/

Solution 13 - Spring

You don't need to use profiles to avoid the error. You can configure the spring-boot-maven-plugin like this:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.3</version> <!-- use the corresponding version of your spring boot -->
        <executions>
            <execution>
                <id>repackage-application1</id>
                <phase>package</phase>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <mainClass>com.yourpackage1.Application1</mainClass>
                    <finalName>app1</finalName>
                    <outputDirectory>target/apps</outputDirectory>
                </configuration>
            </execution>
            <execution>
                <id>repackage-application2</id>
                <phase>package</phase>
                <goals>
                    <goal>repackage</goal>
                </goals>
                <configuration>
                    <mainClass>com.yourpackage2.Application2</mainClass>
                    <finalName>app2</finalName>
                    <outputDirectory>target/apps</outputDirectory>
                </configuration>
            </execution>
        </executions>
    </plugin>

This will create app1.jar and app2.jar in your target folder.

Important note: if you inherit from spring-boot-starter-parent, it executes by default the spring-boot-maven-plugin with a default configuration that expects only one spring application. If you have two apps in a module, that default configuration will fail with the error "Unable to find a single main class" error. To fix your build you need to deactivate the default plugin execution in your parent pom. One way to do it could be to exclude a plugin in the parent pom you can take a look at https://stackoverflow.com/questions/4839581/maven-exclude-plugin-defined-in-parent-pom (did not try it myself)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionNunyet de Can Cal&#231;adaView Question on Stackoverflow
Solution 1 - SpringSean Patrick FloydView Answer on Stackoverflow
Solution 2 - SpringEugene MaysyukView Answer on Stackoverflow
Solution 3 - SpringyılmazView Answer on Stackoverflow
Solution 4 - SpringHolger BrandlView Answer on Stackoverflow
Solution 5 - SpringSheikh Abdul WahidView Answer on Stackoverflow
Solution 6 - SpringMatteo GaggianoView Answer on Stackoverflow
Solution 7 - Springvaquar khanView Answer on Stackoverflow
Solution 8 - SpringsapyView Answer on Stackoverflow
Solution 9 - SpringschoonView Answer on Stackoverflow
Solution 10 - SpringromskyView Answer on Stackoverflow
Solution 11 - SpringTadele AyelegnView Answer on Stackoverflow
Solution 12 - SpringHany SakrView Answer on Stackoverflow
Solution 13 - Springi000174View Answer on Stackoverflow