使用Gradle的Spring Boot多模块项目不会构建

时间:2017-12-01 17:49:41

标签: java spring spring-boot gradle build.gradle

我正在使用包含多个模块的Spring Boot应用程序,我们正在使用Gradle构建它。不幸的是,我无法正确使用Gradle配置。

项目结构如下:

import numpy as np
from PIL import Image

# gradient between 0 and 1 for 256*256
array = np.linspace(0,1,256*256)

# reshape to 2d
mat = np.reshape(array,(256,256))

# Creates PIL image
img = Image.fromarray( mat , 'L')
img.show()

当我尝试构建项目时,我收到像parent | + build.gradle | + settings.gradle | + core | | | + build.gradle | + apis | | | + build.gradle | + services | | | + build.gradle | + data | | | + build.gradle 这样的编译错误,说服务中使用的数据类没有被导入。我认为所有模块都是如此。

我的父build.gradle看起来像这样:

error: cannot find symbol

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

其中一个孩子(核心)在其中有build.gradle:

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

服务build.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')
}

其他的也只声明依赖。

依赖结构如下所示:

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 -

4 个答案:

答案 0 :(得分:32)

在您的实用程序(数据)项目中:

bootJar {
    enabled = false
}

jar {
    enabled = true
}

答案 1 :(得分:10)

答案类似于this one

Gradle documentation关于多项目构建状态:

  

“lib”依赖项是执行依赖项的一种特殊形式。它   导致首先构建另一个项目并添加jar   类路径的其他项目的类。

因此,重新包装的罐子会产生问题。

如果项目B取决于项目A,项目A已应用org.springframework.boot插件,则会产生一个简单的compile project(':A')依赖项因为项目jar在bootRepackagebootJar任务期间被重新打包,所以不起作用。生成的胖罐有不同的结构,阻止Gradle加载它的类。

在这种情况下,依赖关系应按以下方式编写:

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

直接使用源集的输出等同于使用" normal"在重新打包之前生成jar项目A

答案 2 :(得分:1)

bootJar {
    enabled = false
}

jar {
    enabled = true
}

这适用于我的。在我的情况下使用弹簧云与多项目和gradle无法建立弹簧启动。这个解决方案有效!

答案 3 :(得分:1)

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

dependencyManagement配置包含在所有spring-boot托管子模块中:

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

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