Java 应用Spring引导插件时未找到包

Java 应用Spring引导插件时未找到包,java,spring-boot,gradle,module,Java,Spring Boot,Gradle,Module,我有一个包含以下build.gradel文件的多模块项目 核心: 测试模块: dependencies { implementation project(":core") } 应用程序: 然后是根: buildscript { repositories { mavenCentral() } } plugins { id "io.spring.dependency-management" version &

我有一个包含以下build.gradel文件的多模块项目

核心:

测试模块:

dependencies {
    implementation project(":core")
}
应用程序:

然后是根:

buildscript {
    repositories {
        mavenCentral()
    }
}

plugins {
    id "io.spring.dependency-management" version "1.0.4.RELEASE"
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'war'
}

repositories {
    mavenCentral()
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'war'
    apply plugin: 'idea'
    apply plugin: "io.spring.dependency-management"
    apply plugin: 'org.springframework.boot'

    sourceCompatibility = 11

    repositories {
        mavenCentral()
    }

    dependencies {
        compile 'org.springframework.boot:spring-boot-starter-web'
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }
}
核心模块应该代表spring boot应用程序,测试模块通过创建一个通过依赖项注入在核心中使用的服务来提供额外的功能。 app模块有一个调用
SpringApplication.run(Core.class,args)的主类。我认为
app
似乎没有用,但最终,这个模块将被使用这个项目中模块的单独项目所取代

问题是这样编译
test
失败,错误是无法找到
core
中的包。通过谷歌搜索,我发现将spring引导插件应用到所有模块都会导致这个问题,因为它禁用了
jar
任务。但是,如果没有该插件,构建会失败,并出现一个错误,即无法找到
spring boot starter web
依赖项,但我需要在所有模块中找到该依赖项,以便我可以使用
@Service
注释之类的内容


我如何解决这个问题?

在Gradle中,如果您没有为所使用的依赖项指定版本号,那么它们需要由其他东西提供。在您的例子中,另一个是
io.spring.dependency management
插件。然而,只有当您还应用了
org.springframework.Boot
插件时,它才知道SpringBoot。因此,一旦您删除它,依赖关系管理插件就不能再为依赖关系提供版本了

有很多方法可以解决这个问题。这里是我能想到的主要的。它们都在Groovy DSL中。我将每种情况都列为一般情况,因此您必须对其进行一些调整,以适应您的项目。更具体地说,您应该从根目录中删除所有插件(或者将它们设置为
apply false
),并将它们添加到相关的子项目中。您也可能不需要
war
idea
插件

(顺便说一句,我个人更喜欢选项B。)

A.单独使用Spring依赖关系管理插件 在列表中有Spring启动插件,但不要应用它。这使得插件类在项目类路径上可用,因此您可以引用它。然后,您可以将Spring引导bom提供给依赖项管理插件:

插件{

id“org.springframework.boot”version“2.4.0”在Gradle中应用false/,如果您没有为所使用的依赖项指定版本号,则它们需要由其他内容提供。在您的情况下,其他内容是
io.spring.dependency management
插件。但是,只有在您也有
o的情况下,它才知道spring boot已应用rg.springframework.boot
插件。因此,一旦删除该插件,依赖项管理插件将无法再为依赖项提供版本

有很多方法可以解决这个问题。以下是我能想到的主要方法。它们都在Groovy DSL中。我将每种方法都列为一般情况,因此您必须根据您的项目对其进行一些调整。更具体地说,您应该从根目录中删除所有插件(或将它们设置为
应用false
)并将它们添加到相关的子项目中。您也可能不需要
war
idea
插件

(顺便说一句,我个人更喜欢选项B。)

A.单独使用Spring依赖关系管理插件 将Spring Boot插件放在列表中,但不要应用它。这会使插件类在项目类路径上可用,以便您可以引用它。然后您可以将Spring Boot bom提供给依赖项管理插件:

插件{
id“org.springframework.boot”版本“2.4.0”应用错误//
repositories {
    mavenCentral()
}

dependencies {
    implementation project(":core")
    implementation project(":test")
}

springBoot{
    mainClassName = "com.yenovi.dev.Main"
}
buildscript {
    repositories {
        mavenCentral()
    }
}

plugins {
    id "io.spring.dependency-management" version "1.0.4.RELEASE"
    id 'org.springframework.boot' version '2.3.3.RELEASE'
    id 'war'
}

repositories {
    mavenCentral()
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'war'
    apply plugin: 'idea'
    apply plugin: "io.spring.dependency-management"
    apply plugin: 'org.springframework.boot'

    sourceCompatibility = 11

    repositories {
        mavenCentral()
    }

    dependencies {
        compile 'org.springframework.boot:spring-boot-starter-web'
        testImplementation('org.springframework.boot:spring-boot-starter-test') {
            exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
        }
    }
}