【问题标题】:Gradle configuration for multi-module project with shared dependencies具有共享依赖项的多模块项目的 Gradle 配置
【发布时间】:2014-01-19 06:41:39
【问题描述】:

用 gradle 做第一个项目,所以我看看 spring、gradle、hibernate 项目是如何组织 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'

问题是,当我使用一组依赖项等制作 foobar-system-jpa.gradle 文件时,它不起作用 - 此模块无法访问任何依赖项。但是,当在 root 'foobar' build.gradle 中为 'foobar-system-jpa' 子项目制作一组 deps - 它工作正常。为什么?

我的根build.gradle

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

}

我的 dependecies.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",
           .....

    ]
}

还有我的 settings.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 不起作用(模块无法编译,导致找不到任何依赖项)

dependencies {
    compile libs.spring_orm
    compile (libs.spring_data_jpa) {
        exclude(module: 'spring-jdbc')
        exclude(module: 'spring-orm')
    }
    compile libs.hibernate_entitymanager
    compile libs.postgresql
    compile libs.commons_dbcp
    compile project(':foobar-system:foobar-system-tx')
}

感谢您的回复。如需灵感,请查看此项目https://github.com/hibernate/hibernate-orm/blob/master/hibernate-entitymanager/hibernate-entitymanager.gradle

UPD:删除一些不必要的代码

【问题讨论】:

  • 您收到的错误信息是什么?
  • @JBaruch 没有错误,但编译时似乎 foobar-system-jpa 没有找到任何依赖项。

标签: java gradle


【解决方案1】:

您的settings.gradle 有问题。它正在为rootProject.children 配置buildFileName,它们是根项目的立即 子项。因此,超过一级深度的项目的所有构建脚本都将被忽视。

要解决此问题,您可以显式设置构建脚本名称,也可以编写递归设置它们的方法。

PS:总是尝试提出一个最小的失败示例,而不是发布代码页面。

【讨论】:

  • 谢谢,这是真正的工作。我尝试使用完整路径,例如:project(':foobar-app:people:people-core').buildFileName = "$rootDir/foobar-app/people/people-core.gradle" 但它不起作用,所以当我现在只输入构建文件的名称时 - 它的工作。 project('') = "people-core.gradle" 哇,对我来说不是很明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2011-09-14
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
相关资源
最近更新 更多