将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败

Posted

技术标签:

【中文标题】将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败【英文标题】:Failed on Converting Monolithic Spring Boot App with Gradle into Multi Module 【发布时间】:2020-10-06 02:55:39 【问题描述】:

实际上,我有一个带有 gradle 的单片 Spring Boot 应用程序,我想将其转换为多模块。 它只是一个简单的应用程序来做 CRUD 书。

我的应用结构如下,

simple-app
| src/main/java/example/simpleapp
| -------------------------------/controller`
| -------------------------------/exception
| -------------------------------/model
| -------------------------------/repository
| -------------------------------/service
| -------------------------------SimpleAppAplication
| build.gradle
| settings.gradle

我一步一步把所有的包分成模块, 然后我的文件夹结构更改为如下

simple-app
| controller
| | src
| | build.gradle
| exception
| | src
| | build.gradle
| main-app
| | src
| | build.gradle
| model
| | src
| | build.gradle
| repository
| | src
| | build.gradle
| service
| | src
| | build.gradle
| build.gradle
| settings.gradle

如果我运行该项目,它可以正常工作并返回应该返回的结果。

但是,当我构建项目时,它变成了这样的错误。

PC:~/simple-app$ ./gradlew build
> Task :repository:compileJava FAILED
/simple-appp/repository/src/main/java/example/simpleapp/repository/BookRepository.java:3: error: package nanihutagaol.simpleapp.model does not exist
import example.simpleapp.model.Book;
                               ^
simple-app/repository/src/main/java/example/simpleapp/repository/BookRepository.java:9: error: cannot find symbol
public interface BookRepository extends JpaRepository<Book, Long> 
                                                  ^
symbol: class Book
2 errors
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':repository:compileJava'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.4.1/userguide/command_line_interface.html#sec:command_line_warnings
BUILD FAILED in 2s
3 actionable tasks: 1 executed, 2 up-to-date

我不明白为什么它会变成那样的错误,因为模型包是存在的。希望你们中的一个可以提供解决方案。

谢谢之前...

edited:

在存储库/build.gradle

group = 'example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories 
  mavenCentral()

dependencies 
  implementation project(":model")
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-web'

关于模型/build.gradle

group = 'example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories 
  mavenCentral()

configurations 
  compileOnly 
    extendsFrom annotationProcessor
  

dependencies 
  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
  implementation 'org.springframework.boot:spring-boot-starter-web'
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
  runtimeOnly 'org.postgresql:postgresql'

【问题讨论】:

你有没有为每个子项目配置项目依赖? (例如,repository 可能应该具有 model 依赖项。)也许您可以为一些不起作用的子项目共享 build.gradle 文件。 是的,我对子项目有任何依赖。我已经用出现错误的文件的build.gradle 编辑了我的问题。 我看到您使用的是 Spring Boot。您是否将 spring-boot 插件应用于所有项目?例如在subprojectsallprojects 块中? 我在根项目上使用子项目,像这样subprojects apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' apply plugin: 'java' 【参考方案1】:

在尝试理解其他类似主题后,我终于可以解决错误了。

所以我在root/build.gradle 上的第一个语法如下

plugins 
    id 'org.springframework.boot' version '2.3.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'

group = 'example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories 
    mavenCentral()


configurations 
    compileOnly 
        extendsFrom annotationProcessor
    


dependencies 
    implementation project(":main-app")


test 
    useJUnitPlatform()


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

然后我通过在root/build.gradlesubprojects/build.gradle 上添加以下代码来更新它

bootJar 
  enabled = false


jar 
  enabled = true

根据https://spring.io/guides/gs/multi-module/ 上的指南,该代码用于告诉 Gradle 不要为库项目构建可执行 jar。

我不知道为什么我之前错过了这一步。所以,我最后一个root/build.gradle 看起来像

plugins 
    id 'org.springframework.boot' version '2.3.0.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'


group = 'example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

bootJar 
    enabled = false


jar 
    enabled = true


repositories 
    mavenCentral()


dependencies 
    implementation project(":main-app")


test 
    useJUnitPlatform()


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

    group = 'example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = '1.8'

    repositories 
        mavenCentral()
    
    
    bootJar 
        enabled = false
    

    jar 
        enabled = true
    

然后我更新我所有的subproject/build.gradle,只需添加依赖标签。例如repository/build.gradle

dependencies 
    implementation project(":model")
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'

这就是我所有的问题解释...... :)

【讨论】:

以上是关于将带有 Gradle 的单片 Spring Boot 应用程序转换为多模块失败的主要内容,如果未能解决你的问题,请参考以下文章

如何将简单的 Spring Boot(带有 Gradle 构建系统)部署到 Apache Tomcat(真实服务器,而不是嵌入服务器)?

使用带有 Spring Boot、Gradle 和 Idea 的 querydsl 时 QClasses 中未解析的符号

使用带有gradle的spring数据时出现NoClassFoundDefError

是否可以将 AngularJs 包含到带有 Gradle 的项目中

spring boo的简单搭建(eclipse+springboot + redis + mysql + thymeleaf)

带有 Gradle 的 Spring Boot 任务失败:测试?