我有一个包含以下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
注解。
我怎样才能解决这个问题?
1条答案
按热度按时间4szc88ey1#
在gradle中,如果您没有为所使用的依赖项指定版本号,那么它们需要由其他东西提供。在你的情况下,另一个是
io.spring.dependency-management
插件。然而,它只知道 Spring 开机,如果你也有org.springframework.boot
已应用插件。所以一旦你删除了它,依赖管理插件就不能再为依赖提供版本了。有很多方法可以解决这个问题。以下是我能想到的主要的。都是groovy dsl。我把每一个都列为一般情况,所以你必须根据你的项目调整一下。更具体地说,您应该从根目录中删除所有插件(或者将它们设置为
apply false
)并将它们添加到相关的子项目中。你也可能不需要war
以及idea
插件。(顺便说一句,我个人更喜欢选择b。)
答。单独使用spring依赖管理插件
在列表中有spring引导插件,但不要应用它。这使得插件类在项目类路径上可用,因此您可以引用它。然后您可以将spring引导bom提供给依赖关系管理插件:
更多信息请看这里。
b。不要使用spring依赖管理插件
这个插件的优点之一是,如果您是从maven迁移的,因为它反映了依赖关系管理规则。还有一些其他特性。但是,如果您没有使用这些特性,也没有从maven迁移,则不需要它。只需使用普通渐变语义:
c。使用这两个插件,但禁用启动jar任务。
spring引导插件禁用了正常的
jar
任务,但您可以重新启用它。因为两者的jar文件名是相同的jar
以及bootJar
,你不能同时拥有它们。所以要么也禁用bootJar
或者给它一个分类器。在这里我禁用了它。更多信息请看这里。
我为冗长的回答道歉。我被迷住了:)