Java 具有共享依赖项的多模块项目的梯度配置
用gradle做第一个项目,我看看spring、gradle、hibernate项目是如何组织gradle文件的,然后开始做我自己的。但是,找不到错误,为什么我的配置不工作。(子项目无法解决依赖关系) 所以项目树:Java 具有共享依赖项的多模块项目的梯度配置,java,gradle,Java,Gradle,用gradle做第一个项目,我看看spring、gradle、hibernate项目是如何组织gradle文件的,然后开始做我自己的。但是,找不到错误,为什么我的配置不工作。(子项目无法解决依赖关系) 所以项目树: Root project 'foobar' +--- Project ':foobar-app' | +--- Project ':foobar-app:people' | | +--- Project ':foobar-app:people:people-api' | | +---
Root project 'foobar'
+--- Project ':foobar-app'
| +--- Project ':foobar-app:people'
| | +--- Project ':foobar-app:people:people-api'
| | +--- Project ':foobar-app:people:people-core'
| | +--- Project ':foobar-app:people:people-data'
| | \--- Project ':foobar-app:people:people-rest'
| \--- Project ':foobar-app:realtor'
+--- Project ':foobar-starter'
\--- Project ':foobar-system'
+--- Project ':foobar-system:foobar-system-jpa'
+--- Project ':foobar-system:foobar-system-neo4j'
+--- Project ':foobar-system:foobar-system-persistence'
+--- Project ':foobar-system:foobar-system-repository'
\--- Project ':foobar-system:foobar-system-tx'
configurations.all {
// check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
configure(allprojects) { project ->
group = 'com.foobar'
version = '0.0.1-SNAPSHOT'
apply from: "${rootDir}/dependencies.gradle"
apply plugin: 'maven'
apply plugin: 'idea'
ext.gradleScriptDir = "${rootProject.projectDir}/gradle"
apply from: "${gradleScriptDir}/task.gradle"
}
configure(subprojects) { subproject ->
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
apply from: "${rootDir}/dependencies.gradle"
repositories {
mavenCentral()
maven { url "http://m2.neo4j.org/" }
maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
testCompile (libs.junit)
testCompile (libs.mockito)
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
}
}
问题是,当我使用一组依赖项等创建foobar-system-jpa.gradle文件时,它不起作用-此模块无法访问任何依赖项。但是,在根“foobar”build.gradle中,为“foobar系统jpa”子项目创建一组DEP—它可以正常工作。为什么?
我的根构建。gradle:
Root project 'foobar'
+--- Project ':foobar-app'
| +--- Project ':foobar-app:people'
| | +--- Project ':foobar-app:people:people-api'
| | +--- Project ':foobar-app:people:people-core'
| | +--- Project ':foobar-app:people:people-data'
| | \--- Project ':foobar-app:people:people-rest'
| \--- Project ':foobar-app:realtor'
+--- Project ':foobar-starter'
\--- Project ':foobar-system'
+--- Project ':foobar-system:foobar-system-jpa'
+--- Project ':foobar-system:foobar-system-neo4j'
+--- Project ':foobar-system:foobar-system-persistence'
+--- Project ':foobar-system:foobar-system-repository'
\--- Project ':foobar-system:foobar-system-tx'
configurations.all {
// check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
configure(allprojects) { project ->
group = 'com.foobar'
version = '0.0.1-SNAPSHOT'
apply from: "${rootDir}/dependencies.gradle"
apply plugin: 'maven'
apply plugin: 'idea'
ext.gradleScriptDir = "${rootProject.projectDir}/gradle"
apply from: "${gradleScriptDir}/task.gradle"
}
configure(subprojects) { subproject ->
apply plugin: 'java'
sourceCompatibility = 1.7
targetCompatibility = 1.7
apply from: "${rootDir}/dependencies.gradle"
repositories {
mavenCentral()
maven { url "http://m2.neo4j.org/" }
maven { url "http://repo.maven.apache.org/maven2" }
}
dependencies {
testCompile (libs.junit)
testCompile (libs.mockito)
testCompile group: 'org.hamcrest', name: 'hamcrest-library', version: '1.3'
}
}
我的依赖。gradle
ext {
springVersion = "4.0.0.RELEASE"
jUnitVersion = "4.11"
hibernateVersion = "4.2.1.Final"
libs = [
//springframework
spring_core: "org.springframework:spring-core:$springVersion",
spring_orm: "org.springframework:spring-orm:$springVersion",
......
hibernate_entitymanager: "org.hibernate:hibernate-entitymanager:$hibernateVersion",
hibernate_persistence: "org.hibernate.javax.persistence:hibernate-jpa-2.0-api:1.0.1.Final",
//database
postgresql : "org.postgresql:postgresql:9.3-1100-jdbc41",
commons_dbcp : "commons-dbcp:commons-dbcp:1.4",
.....
]
}
和我的设置。gradle
rootProject.name = 'foobar'
include ':foobar-system:foobar-system-jpa'
....
include ':foobar-app:people:people-rest'
include ':foobar-app:people:people-core'
....
include ':foobar-starter'
project(':foobar-system:foobar-system-jpa').projectDir = "$rootDir/foobar-system/foobar-system-jpa" as File
project(':foobar-system:foobar-system-repository').projectDir = "$rootDir/foobar-system/foobar-system-repository" as File
.....
project(':foobar-app').projectDir = "$rootDir/foobar-app" as File
project(':foobar-starter').projectDir = "$rootDir/foobar-starter" as File
rootProject.children.each { project ->
project.buildFileName = "${project.name}.gradle"
assert project.projectDir.isDirectory()
assert project.buildFile.exists()
assert project.buildFile.isFile()
}
所以,foobar-system-jpa.gradle不起作用(模块无法编译,导致找不到任何依赖项)
谢谢你的回复。要获得灵感,请看一下这个项目
UPD:删除一些不必要的代码您的
设置有问题。gradle
。它正在为根项目的直接子项目rootProject.children
配置buildFileName
。因此,对于深度超过一级的项目,所有构建脚本都将被忽略
要解决此问题,可以显式设置生成脚本名称,也可以编写递归设置它们的方法
附言:总是尝试提出一个最小的失败例子,而不是张贴代码页 您收到的错误消息是什么?@JBaruch没有错误,但我编译foobar system jpa时似乎没有找到任何依赖项。谢谢,这是真正的工作。我尝试使用完整路径,比如:
project(“:foobar-app:people:people-core”).buildFileName=“$rootDir/foobar-app/people/people-core.gradle”
,但它不起作用,所以当我现在只输入构建文件的名称时,它起作用了<代码>项目(“”)=“people core.gradle”哇,对我来说这并不明显。