当前位置: 首页 > 知识库问答 >
问题:

具有多项目Gradle-->主类名的springboot尚未配置,无法解析

栾昂雄
2023-03-14

我有以下项目结构:

RootProject
├── lib
     └── src
          └── main
               └── java
                    └── ...
├── test-project
     └── src
          └── main
               └── java
                    └── ...

└── build.gradle

我试图遵循Gradle多项目构建的最佳实践,因此我在单个build.Gradle文件中描述了整个构建过程。

“rootProject”只是一个没有任何代码的根项目,它的唯一目的是为它的子项目“lib”和“test-project”提供一个单独的build.gradle。

“Test-Project”是使用“lib”作为编译依赖项springboot项目(微服务)。

我的通用Build.Gradle看起来如下:

plugins{
    id 'java'
    id 'org.springframework.boot' version '2.1.1.RELEASE'
    id 'io.spring.dependency-management' version '1.0.6.RELEASE'
}


allprojects {
    repositories {
        jcenter()
    }
}


subprojects {

    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'org.springframework.boot'

    group = 'com.xxx.yyy'
    version = '1.0'

    sourceCompatibility = 1.8
    targetCompatibility = 1.8
}


project(":lib"){

    apply plugin: 'java-library'

    dependencies {

        implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'
        implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa'
        testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test'
    }

    bootJar { enabled = false }
    jar { enabled = true }
}

project(":test-project"){

    apply plugin: 'java'

    dependencies {
        implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web'
        implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa'
        implementation project(":lib")
        implementation ('mysql:mysql-connector-java')
    }
}

实现了“库”和“测试项目”的成功构建。然而,当我试图在根项目上执行“bootjar”任务(它应该触发所有子项目上的“build”任务)时,我得到了以下错误:

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

有什么想法吗?

共有1个答案

谢善
2023-03-14

多项目构建最佳实践简介

当你说:

我试图遵循Gradle多项目构建的最佳实践,因此我在单个build.Gradle文件中描述了整个构建过程。

我不认为这实际上是一个好的做法,这也不是你提到的指南中真正推荐的。

在指南介绍中:

虽然每个子项目都可以完全独立于其他子项目来配置自己,但子项目具有共同的特征是很常见的。因此,通常最好在项目之间共享配置,因此相同的配置会影响多个子项目。

=>实际上,子项目之间共享的公共特性应该配置在根项目构建的中心位置。

在指南的后面部分(在本节中)有一个示例,它在根项目脚本中定义了子项目特定配置,但在示例描述中有一个注释:

所有的构建逻辑都在根项目的构建脚本中

(2):我们在这里这样做,因为它使布局更容易一些。我们通常将特定于项目的东西放入相应项目的构建脚本中。

关于你的问题

我假设您的lib项目是一个简单的“简单”Java lib项目(没有spring或springboot依赖关系),test-project是包含springboot应用程序类的项目(特别是@SpringBootApplication主应用程序类)。按照上面描述的最佳实践,您应该有三个不同的项目构建脚本:

  • 根项目:用于在子项目中定义公共配置共享(Java插件配置、存储库、共享依赖项等)
  • lib项目:此lib项目的特定配置(Java库插件、特定依赖项、...)
    • 没有理由将spring-boot插件应用于此子项目,这实际上是您错误“找不到主类”
    • 的原因
    • 如果此项目依赖于spring核心模块,您可以简单地应用io.Spring.dependency-management插件(在此cas中,在根项目构建中应用此依赖插件,以便在两个子项目中使用相同的spring版本是有意义的)

    示例

    根项目生成

    ext{
        slf4jVersion = "1.7.25"
    }
    
    subprojects {
        apply plugin: "java"
        // if both subprojects share some Spring related dependencies, apply the Spring `io.spring.dependency-management` here.
    
        group = 'com.xxx.yyy'
        version = '1.0'
    
        sourceCompatibility = 1.8
        targetCompatibility = 1.8
    
        repositories {
            jcenter()
        }
    }
    

    “lib”项目生成

    plugins{
        id 'java-library'
    }
    
    dependencies {
        implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
        // lib dependencies
    }
    

    “test-project”生成

    plugins {     
        id "org.springframework.boot"  version "2.1.1.RELEASE"
    }
    apply plugin: 'io.spring.dependency-management'
    
    dependencies {
        implementation project(":lib")
        implementation('org.springframework.boot:spring-boot-starter-web')
        testImplementation('org.springframework.boot:spring-boot-starter-test')
        implementation ('mysql:mysql-connector-java')
        // ...
    }
    

    根据您的评论进行编辑:如果lib项目需要与spring数据相关的内容,请按以下方式应用io.Spring.dependency-management(请参阅《spring参考指南》中的更多详细信息)

    plugins{
        id 'java-library'
        id "org.springframework.boot"  version "2.1.1.RELEASE" apply false
    }
    apply plugin: 'io.spring.dependency-management'
    
    dependencyManagement {
        imports {
            mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
        }
    }
    
    dependencies {
        implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa' 
        // lib dependencies
    }
    

 类似资料:
  • 我正在使用Gradle构建一个项目,但是每当我想通过

  • 我有一个项目,它是用gradle 6或更旧的版本构建的。 我检查了gradle 7中关于编译/测试编译问题的其他stakeoverflow讨论,并将所有依赖项从编译/测试编译更改为api/测试实现。 但当我做gradle build时,它仍然不起作用。 它仍然返回名为“compile”的配置 我检查过这个: 使用gradle构建错误找不到方法testCompile() Gradle中的实现、api

  • 我正在从事一个Gradle项目,该项目使用多个源集来构建不同的战争。 从命令行一切正常。格拉德正确地构建了战争。但是在IntelliJ中它说对于每个*。src/k下的java文件无法解析来自src/main的依赖关系。 我试图通过使用idea gradle插件将目录添加为SourceDir来修复它,但不幸的是,这没有起作用。

  • 我在intellij中创建了一个gradle/scala项目。这是我的项目结构 这些是我build.gradle文件的内容 主要课程内容 当我试图构建jar并执行它时,会出现一个错误。这里可能出了什么错?

  • 几天来,我一直在尝试使用nativescript。我的所有安装都进行得很好,但在执行tns运行的android——emulator时,它给了我以下错误: MiC@USERMINGW32 ~/Android项目/HelloWorld$tns运行Android搜索设备。。。跳过准备。正在生成项目。。。Gradle构建。。。 失败:生成失败,出现异常。 > 问题:配置根项目“HelloWorld”时出现