Gradle:多个java项目的公共资源依赖项

时间:2013-11-22 03:00:24

标签: java intellij-idea gradle

我正在使用gradle / intellij-idea开发一个多模块项目,这是我项目主页的结构:

project/
  sub-project-1
    /main/resources
  sub-project-2
    /main/resources
  data
    /main/resources
    /test/resources

正如您所看到的,我有多个子项目(所有java),我怎样才能让它们依赖于一些公共资源(“数据”项目,它不包含代码而只包含资源),以及它们各自独立的资源?

同样最好的是intellij-idea可以自动使用JetGradle获取这些依赖项(JetGradle可以很好地获取每个子项目中的默认gradle java项目依赖项)。

非常感谢!

7 个答案:

答案 0 :(得分:9)

一种解决方案是将Java插件也应用于data项目,然后使用常规项目依赖项(例如dependencies { runtime project(":data") })。但是,这需要一些努力来防止运送测试资源。

另一个解决方案不是让data成为Gradle项目,而是将其资源目录包含在其他两个项目中(sourceSets.main.resources.srcDir "../date/main/resources"; sourceSets.test.resources.srcDir "../data/test/resources")。

答案 1 :(得分:6)

我采用的方法是使用项目参考

sourceSets {
    main {
        resources {
            srcDirs += [
                project(':data').sourceSets.main.resources
            ]
        }
    }
}

答案 2 :(得分:4)

好的,我明白了。它实际上非常简单。只需将“data”文件夹视为另一个项目,并将依赖性声明添加到子项目就可以了。例如:

dependencies {
    compile project (':data')
    testCompile project (':data')
}

答案 3 :(得分:1)

您需要选择保存资源的项目。需要这些资源的所有其他项目都会将它们添加到sourceSets的resources组件中。

sourceSets {
    data {
        resources {
            srcDir "${project(':data').projectDir}/src/main/resources"
            include "your_pattern_here**"
        }
    }
    main {
        resources {
            srcDirs += [ data.resources ]
        }
    }
}

答案 4 :(得分:0)

这是Kotlin DSL的版本-将:data模块中的所有资源同步到root以及所有子模块的build / resources文件夹:

// Synchronizing resources from :data module to project root: build/resources
synchronizeSharedResources()

subprojects {
    // Synchronizing resources from :data module to all submodules: build/resources
    synchronizeSharedResources()
}

fun Project.synchronizeSharedResources() {
    sourceSets {
        main {
            resources.srcDir(project(":data").sourceSets["main"].resources.srcDirs)
        }
        test {
            resources.srcDir(project(":data").sourceSets["test"].resources.srcDirs)
        }
    }
}

答案 5 :(得分:0)

sourceSets {
    main {
        resources {
            srcDirs += [
                '../sub-project-1/src/main/resources',
                '../sub-project-2/src/main/resources',
                '../data/src/main/resources'
            ]
        }
    }

    test {
        resources {
            srcDir '../data/src/test/resources'
        }
    }    
}

答案 6 :(得分:0)

我在多模块项目中遇到了另一个资源问题,可能对某人有帮助。

我有两个独立的模块:

- database (contains migrations for whole project)
- main (contains business logic(controllers, services and etc))

我也在我的项目中使用 Spring-Boot 2。

我在 main 中进行了集成测试,在测试开始之前,我需要在 DB 中创建架构和表。但是我在 Flyway 模块中的所有迁移(使用 database 进行迁移控制)。迁移路径为 src/main/resources/db/migrations

因此,我需要在 /test/resources 中进行所有迁移才能开始测试。当然,我不想在 main 模块中重复迁移,我找到了这个解决方案。我需要在 main 模块的文件中添加这些行。

builde.gradle

dependencies { 
   testImplementation "com.example.module:database:$dbMigrationVersion"
}

application-test.yml

spring:
  flyway:
     locations: classpath:/BOOT-INF/classes/db/migration

在这些行之后,您从 database 模块中的所有迁移都将位于 main 模块类路径中(在我们的例子中是 test 配置文件)。而且 flyway 可以在开始测试之前执行它们。