应用spring引导插件时找不到包

mzsu5hc0  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(550)

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

repositories {
    mavenCentral()
}

dependencies {
    providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

测试模块:

dependencies {
    implementation project(":core")
}

应用程序:

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

核心模块应该表示spring引导应用程序,测试模块通过创建一个通过依赖注入在核心中使用的服务来提供额外的功能。应用程序模块有一个调用 SpringApplication.run(Core.class, args); . 我知道 app 似乎没有用,但在最后,这个模块将被替换为单独的项目,将使用这个项目的模块。
问题是这样编的 test 失败,错误为 core 找不到。在google搜索之后,我发现将spring引导插件应用到所有模块会导致这个问题,因为它禁用了 jar 任务。但是,如果没有这个插件,构建会失败,并出现一个错误,即 spring boot starter web 依赖关系找不到,但我需要在我所有的模块,所以我可以使用像 @Service 注解。
我怎样才能解决这个问题?

4szc88ey

4szc88ey1#

在gradle中,如果您没有为所使用的依赖项指定版本号,那么它们需要由其他东西提供。在你的情况下,另一个是 io.spring.dependency-management 插件。然而,它只知道 Spring 开机,如果你也有 org.springframework.boot 已应用插件。所以一旦你删除了它,依赖管理插件就不能再为依赖提供版本了。
有很多方法可以解决这个问题。以下是我能想到的主要的。都是groovy dsl。我把每一个都列为一般情况,所以你必须根据你的项目调整一下。更具体地说,您应该从根目录中删除所有插件(或者将它们设置为 apply false )并将它们添加到相关的子项目中。你也可能不需要 war 以及 idea 插件。
(顺便说一句,我个人更喜欢选择b。)

答。单独使用spring依赖管理插件

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

plugins {
    id 'org.springframework.boot' version '2.4.0' apply false // <- Apply false
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

dependencyManagement {
    imports {
        mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}

更多信息请看这里。

b。不要使用spring依赖管理插件

这个插件的优点之一是,如果您是从maven迁移的,因为它反映了依赖关系管理规则。还有一些其他特性。但是,如果您没有使用这些特性,也没有从maven迁移,则不需要它。只需使用普通渐变语义:

plugins {
    id 'org.springframework.boot' version '2.4.0' apply false // <- Apply false
    id 'java'
}

dependencies {
    implementation platform(org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES)
    implementation 'org.springframework.boot:spring-boot-starter'
}

// OR:

plugins {
    id 'java'
}

dependencies {
    implementation platform("org.springframework.boot:spring-boot-dependencies:2.4.0")
    implementation 'org.springframework.boot:spring-boot-starter'
}

c。使用这两个插件,但禁用启动jar任务。

spring引导插件禁用了正常的 jar 任务,但您可以重新启用它。因为两者的jar文件名是相同的 jar 以及 bootJar ,你不能同时拥有它们。所以要么也禁用 bootJar 或者给它一个分类器。在这里我禁用了它。

plugins {
    id 'org.springframework.boot' version '2.4.0' // <- Apply true
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'java'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
}

jar {
    enabled = true
}

bootJar {
    enabled = false
}

更多信息请看这里。
我为冗长的回答道歉。我被迷住了:)

相关问题