我正在使用包含多个模块的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 -
答案 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在bootRepackage
或bootJar
任务期间被重新打包,所以不起作用。生成的胖罐有不同的结构,阻止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文件。