我正在使用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项目依赖项)。
非常感谢!
答案 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 可以在开始测试之前执行它们。