spring Gradle构建失败:尚未配置主类名,因此无法解析它

sq1bmfud  于 2023-01-12  发布在  Spring
关注(0)|答案(9)|浏览(214)

我正在按照this指南用Spring构建一个RESTful Web服务。我正在使用Grable构建应用程序,但我的构建失败了。
我在Windows 10计算机上使用了“build gradle”命令。
这是gradle代码:

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')
}

我收到以下错误:
执行任务“:bootJar”失败。
尚未配置主类名,因此无法解析它

uajslkp6

uajslkp61#

当构建包含springboot项目外模块的多模块项目时,模块的build.gradle必须包含:

bootJar {
    enabled = false
}

jar {
    enabled = true
}
6pp0gazn

6pp0gazn2#

我在使用Kotlin和放错main方法时遇到了这个错误。
错误:

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

修复(将mainApplication中移出):

@SpringBootApplication
class Application

fun main(args: Array<String>) {
    runApplication<Application>(*args)
}
bxfogqkk

bxfogqkk3#

因此,您可以进行配置,请尝试:

apply plugin: 'application'
mainClassName = 'com.example.WebApplication'
xtupzzrd

xtupzzrd4#

使用**org.springframework. Boot **Gradle插件版本2.6.2。

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

我也有类似的问题。
执行任务“:bootJar”失败。未能计算任务“:bootJar”属性“mainClass”的值。尚未配置主类名,因此无法解析该名称
现在,根据 Boot 插件的版本,你必须按照下面的方式定义主类值。

SpringFramework 2.3.12及更早版本

springBoot {
  mainClassName = 'com.example.ExampleApplication'
}

SpringFramework 2.4.0及更新版本

springBoot {
  mainClass = 'com.example.ExampleApplication'
}

提及属性更改的发行说明

vxf3dgd4

vxf3dgd45#

在我的情况下,(使用Kotlin for writing springboot demo)这是由src文件夹引起的,主类文件没有位于src/main文件夹下。此外,我已经清理了所有内容并重新启动IDE。正如@Zaziro提到的,我也尝试过,但没有任何运气。但有文章提到配置mainClassName
在与Github中的src代码进行比较后发现,它与任何软件包的任何版本无关。
祝你好运:-)

68de4m5k

68de4m5k6#

正如@Zaziro提到的,定义配置是可能的。
此站点详细描述了不同类型的配置:https://www.baeldung.com/spring-boot-main-class#gradle
如果您正在使用Kotlin:
注意你的类名会改变,你需要在mainClassName后面加上“Kt”。
示例:“com.示例.应用”-〉“com.示例.应用Kt

2g32fytz

2g32fytz7#

如果我们使用Sping Boot Gradle插件和Kotlin,您可以使用以下代码片段:

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")
}
dldeef67

dldeef678#

我试图按照https://spring.io/guides/gs/spring-boot/中的说明操作,该应用程序中有一个CommandLineRunner。CommandLineRunner中的代码只有在我将bean * 和 * main方法 Package 在类中时才能运行。我可以让测试运行,但不能通过命令行。我可以使用一个伴随对象来解决这个问题:

@SpringBootApplication
class TestApplication {

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            runApplication<TestApplication>(*args)
        }
    }

    @Bean
    fun commandLineRunner(ctx: ApplicationContext): CommandLineRunner {
        ...
    }
}
2ic8powd

2ic8powd9#

根据https://spring.io/guides/gs/multi-module/,库的build.gradle(使用Spring)应该使用Sping Boot 插件而不应用它(apply false):

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

这样就不需要:

bootJar {
    enabled = false
}

jar {
    enabled = true
}

此外,对于使用库的Sping Boot 应用程序,我们需要使用库的组指定scanBasePackages

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);
  }
}

相关问题