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

spring boot多模块工程与梯度不建设

应嘉容
2023-03-14

我正在开发一个有多个模块的spring boot应用程序,我们正在使用Gradle来构建它。不幸的是,我不能得到梯度配置的权利。

项目结构如下:

parent
  |
  + build.gradle
  |
  + settings.gradle
  |
  + core
  |   |
  |   + build.gradle
  | 
  + apis
  |   |
  |   + build.gradle
  |
  + services
  |   |
  |   + build.gradle
  | 
  + data
  |   |
  |   + build.gradle

当我尝试构建项目时,我会遇到一些编译错误,如error:cannot find symbol表示,服务中使用的数据中的类没有导入。我假设所有模块之间都是这样。

我父母建的。Gradle看起来是这样的:

buildscript {
    ext {
        springBootVersion = '2.0.0.BUILD-SNAPSHOT'
    }
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'eclipse'
apply plugin: 'idea'

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

    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/snapshot" }
        maven { url "https://repo.spring.io/milestone" }
    }

    dependencies {
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
}

dependencies {
    compile project(':data')
    compile project(':services')
    compile project(':apis')
    compile project(':core')
}

jar {
    baseName = 'my-jar'
    version = '0.0.1-SNAPSHOT'
}

设置。分级:

rootProject.name = 'my-app'
include ':apis'
include ':core'
include ':data'
include ':services'

其中一个子级(核心)在其构建中包含此内容。Gradle:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-quartz')
    compile('org.springframework.boot:spring-boot-starter-tomcat')
    runtime('com.h2database:h2')

    compile project(':data')
    compile project(':services')
    compile project(':apis')
}

services Build.Gradle如下所示:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-quartz')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    runtime('com.h2database:h2')

    compile project(':data')
}

其他的也只声明依赖项。

依赖关系结构如下所示:

core - apis, services, data

apis - services, data

services - data

data -

编译错误示例:

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:3: error: package com.examples.data.dao does not exist import com.examples.data.dao.IssuedToken;

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:4: error: package com.examples.data.repository does not exist import com.examples.data.repository.IssuedTokenRepository;

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:12: error: cannot find symbol 
    private IssuedTokenRepository issuedTokenRepository;

    symbol:   class IssuedTokenRepository
   location: class IssuedTokenService

/my-app/services/src/main/java/com/example/my-app/business/IssuedTokenService.java:15: error: cannot find symbol
   public void saveToken(IssuedToken issuedToken) {
                                  ^
   symbol:   class IssuedToken
   location: class IssuedTokenService

共有3个答案

庾和昶
2023-03-14

您应该从所有子模块(根build.gradle文件、allprojects块)中排除org.springframework.boot,这些子模块是将构建到fat-jar的核心模块的依赖项。

dependencymanagement配置包含到所有spring引导托管子模块中:

dependencyManagement {
    imports {
        mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
    }
}

问题的原因是核心模块fat-jar中没有子模块编译的jar文件。

颜云瀚
2023-03-14

答案与此相似。

关于多项目生成状态的分级文档:

“lib”依赖关系是执行依赖关系的一种特殊形式。它导致先构建另一个项目,并将具有另一个项目类的jar添加到类路径中。

因此,重新包装的jar会带来问题。

例如,如果项目b依赖于项目a,并且项目a有一个应用于它的org.springframework.boot插件,则简单的编译项目(':a')依赖项将不起作用,因为项目jar在bootrepackagebootjar任务期间被重新打包。由此产生的脂肪罐具有不同的结构,防止Gradle加载其类。

在这种情况下,应该按照以下方式编写依赖项:

dependencies {
  compile project(':A').sourceSets.main.output
}

直接使用源集的输出等同于在重新打包前使用项目a的“正常”结果jar。

戚浩淼
2023-03-14

在实用工具(数据)项目中放置:

bootJar {
    enabled = false
}

jar {
    enabled = true
}

如果kotlin dsl

tasks.getByName<BootJar>("bootJar") {
    enabled = false
}

tasks.getByName<Jar>("jar") {
    enabled = true
}
 类似资料:
  • 我用的是IntelliJ IDEA Pro 13.1.2。从未使用过13以下的任何版本。 当试图从IDE运行时,我得到以下消息:

  • 我已经将Gradle项目导入IntelliJ IDEA 2016.3.3社区版。该项目包括2个内部和4个外部梯度模块。这是根< code>settings.gradle文件 在“Gradle项目”窗格上,我看到所有模块都已导入 但是在“项目”窗格上,只有内部模块 按“同步”和“刷新所有Gradle项目”按钮没有帮助。 虽然我看到从命令行运行,但这个gladle构建了所有6个模块。但我无法从IDE构

  • 我有一个简单的分级项目,其中build.gradle如下所示: 失败:生成失败,出现异常。 请访问https://help.gradle.org获取更多帮助 在%1中生成失败 完整stacktrace如下所示: 我对Gradle不是很有经验。你能告诉我我做错了什么吗?

  • 本文向大家介绍SpringBoot多模块项目框架搭建过程解析,包括了SpringBoot多模块项目框架搭建过程解析的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了SpringBoot多模块项目框架搭建过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 创建根项目,New Project 创建一个名为 sms-bomber 的 Sp

  • 我有一个基本的SpringBoot应用程序。使用Spring初始值设定项、嵌入式Tomcat、Thymeleaf模板引擎,并将包作为可执行的JAR文件。是一个带有Spring Boot的多模块项目,该项目将有3个模块。这里是父模块pom。xml 这里是模块核心 这里是模块web: 从父根目录,我使用以下方法生成所有模块: 但问题是tdk-web-0.0.2-SNAPSHOT。jar不包含tdk-c

  • 父项目为demo-mybatis子模块为mybatis-dao、demo-service。demo-mybatis pom.xml如下: 4.0.0 pom mybatis-DAO Demo-service Demo-mybatis-app org.springframework.Boot spring-boot-starter-parent 2.3.2.release com.example D