相关文章推荐
独立的松鼠  ·  android gradle ...·  2 周前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

Gradle build failed: Main class name has not been configured and it could not be resolved

Ask Question

I am building a RESTful web service with Spring by following this guide. I am using gradle to build the app but my build is failing.

I used the "build gradle" command on a Windows 10 machine.

This is the gradle code:

buildscript {
    repositories {
        mavenCentral()
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.1.6.RELEASE")
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
bootJar {
    baseName = 'gs-rest-service'
    version =  '0.1.0'
repositories {
    mavenCentral()
sourceCompatibility = 1.8
targetCompatibility = 1.8
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web")
    testCompile('org.springframework.boot:spring-boot-starter-test')

I am getting the following error:

Execution failed for task ':bootJar'.

Main class name has not been configured and it could not be resolved

I have same error. In My PC project build successfully. but when try to run command "grade bootjar or build" return above error .. – Mohammad Hossin Samadian May 9 at 13:04

When building a multi-module project which includes a module outside of the springboot project, then the module's build.gradle must contain:

bootJar {
    enabled = false
jar {
    enabled = true
                The file gradle.build mentioned in this post is reversed. It should be build.gradle. Indeed adding the above in build.gradle for a multi-module project resolves the issue
– Khetho Mtembo
                Dec 26, 2021 at 21:13
                I had this issue out of the sudden and your solution helped indeed. However, I have two library modules and only the last one requires it. This is my hierarchy:  [application-module]->[working-library-module]->[non-working-library-module] and I have no explanation for this inconsistency. Both library modules are applying the java-library Gradle plugin. So I guess, the second library is considered outside of the springboot project, but both are in the same multi-module project. Do you have any idea why that might be the case?
– Marian Klühspies
                Jun 30, 2022 at 14:15

I ran into this error when I used kotlin and misplaced the main method.

Wrong:

@SpringBootApplication
class Application {
    fun main(args: Array<String>) {
        runApplication<Application>(*args)

Fix (moved main out of Application):

@SpringBootApplication
class Application
fun main(args: Array<String>) {
    runApplication<Application>(*args)
                In another instance, the java class marked with @SpringBootApplication did not have a static modifier in the main method
– xilef
                May 8, 2021 at 14:34
                How to do the same for spring kotlin, since the main class name does not have a main function.
– alekshandru
                May 22, 2020 at 11:57

With the org.springframework.boot Gradle plugin version 2.6.2.

plugins {
  id 'org.springframework.boot' version '2.4.0'

I had similar issue.

Execution failed for task ':bootJar'. Failed to calculate the value of task ':bootJar' property 'mainClass'. Main class name has not been configured and it could not be resolved

Now depending on the version of the springframework boot plugin you have to define the main class value on following way.

SpringFramework 2.3.12 and older

springBoot {
  mainClassName = 'com.example.ExampleApplication'

SpringFramework 2.4.0 and newer

springBoot {
  mainClass = 'com.example.ExampleApplication'

Release notes mentioning change of the property

in my case, (using Kotlin for writing springboot demo) it was caused by the src folder, the main class file did not locate under src/main folder. besides, I've clean everything up and restart IDE. As @Zaziro mentioned, I've also token a try, but without any luck. But there're articles mentioned config mainClassName,

and after comparing with src code in Github that different, it's not about any version of any package.

Wish u luck :-)

As @Zaziro mentioned, it's possible to define a configuration.

This site describes the different kinds of configuration very well: https://www.baeldung.com/spring-boot-main-class#gradle

IF YOU ARE USING KOTLIN:

Be aware that your class name changes. You need to append your mainClassName with "Kt".

example: "com.example.Application" -> "com.example.ApplicationKt"

According to https://spring.io/guides/gs/multi-module/, the library's build.gradle (that uses Spring) should use Spring Boot Plugin without applying it (apply false):

plugins {
    id 'org.springframework.boot' version '3.0.0' apply false
    id 'io.spring.dependency-management' version '1.1.0'
    id 'java'

That eliminates the need for:

bootJar {
    enabled = false
jar {
    enabled = true

Also, for the Spring Boot application that uses the library, we need to specify scanBasePackages with the library's group:

package com.example.multimodule.application;
import com.example.multimodule.service.MyService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication(scanBasePackages = "com.example.multimodule")
@RestController
public class DemoApplication {
  private final MyService myService;
  public DemoApplication(MyService myService) {
    this.myService = myService;
  @GetMapping("/")
  public String home() {
    return myService.message();
  public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);

If we're using the Spring Boot Gradle plugin and Kotlin you can use the snippet below:

plugins {
    id("org.springframework.boot") version "2.6.7"
    id("io.spring.dependency-management") version "1.0.11.RELEASE"
    kotlin("jvm") version "1.5.31"
    kotlin("plugin.spring") version "1.5.31"
springBoot {
    mainClass.value("com.mycompany.MyApplication")

I was trying to follow the instructions at https://spring.io/guides/gs/spring-boot/ that has a CommandLineRunner in the application. The code inside the CommandLineRunner would only run if I wrapped that bean and the main method in the class. I could get tests to run but not via the command line. I was able to get around this by using a companion object:

@SpringBootApplication
class TestApplication {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            runApplication<TestApplication>(*args)
    @Bean
    fun commandLineRunner(ctx: ApplicationContext): CommandLineRunner {
        

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.