Gradle:多个java项目的公共资源依赖关系
我正在用gradle/intellij idea开发一个多模块项目,以下是我的项目主页的结构:Gradle:多个java项目的公共资源依赖关系,java,intellij-idea,gradle,Java,Intellij Idea,Gradle,我正在用gradle/intellij idea开发一个多模块项目,以下是我的项目主页的结构: project/ sub-project-1 /main/resources sub-project-2 /main/resources data /main/resources /test/resources 正如您所看到的,我有多个子项目(都是java),如何使它们依赖于一些公共资源(“数据”项目,它不包含代码,只包含资源),以及它们自己的独立资源 此
project/
sub-project-1
/main/resources
sub-project-2
/main/resources
data
/main/resources
/test/resources
正如您所看到的,我有多个子项目(都是java),如何使它们依赖于一些公共资源(“数据”项目,它不包含代码,只包含资源),以及它们自己的独立资源
此外,intellij idea最好能够使用JetGradle自动提取这些依赖项(JetGradle只需在每个子项目中提取默认的gradle java项目依赖项即可)
非常感谢 好吧,我想出来了。其实很简单。只需将“数据”文件夹视为另一个项目,并向子项目添加依赖项声明即可。例如:
dependencies {
compile project (':data')
testCompile project (':data')
}
一种解决方案是将Java插件也应用于
数据
项目,然后使用常规项目依赖项(例如依赖项{runtime project(“:data”)}
)。然而,这需要一些努力来防止测试资源的发布
另一个解决方案不是将
data
作为一个Gradle项目,而是将它的资源目录包含在另外两个项目中(sourceset.main.resources.srcDir./data/main/resources;sourceset.test.resources.srcDir./data/test/resources“
)。我采取的方法是使用项目引用
sourceSets {
main {
resources {
srcDirs += [
project(':data').sourceSets.main.resources
]
}
}
}
你需要选择一个项目来保存你的资源。需要这些资源的所有其他项目将把它们添加到源集合的
资源组件中
sourceSets {
data {
resources {
srcDir "${project(':data').projectDir}/src/main/resources"
include "your_pattern_here**"
}
}
main {
resources {
srcDirs += [ data.resources ]
}
}
}
以下是Kotlin DSL的版本-将所有资源从数据模块同步到根目录,并将所有子模块构建/资源文件夹同步:
// 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)
}
}
}
我在多模块项目中遇到了另一个资源问题,它可能会对某些人有所帮助
我有两个独立的模块:
- database (contains migrations for whole project)
- main (contains business logic(controllers, services and etc))
我也在我的项目中使用SpringBoot2
我在main
中进行了集成测试,在测试开始之前,我需要在数据库中创建模式和表。但是我的所有迁移(使用Flyway
进行迁移控制)都在数据库
模块中。迁移路径是src/main/resources/db/migrations
因此,为了启动测试,我需要在/test/resources
中进行所有迁移。当然,我不想在main
模块中重复迁移,我找到了这个解决方案。我需要在main
模块的文件中添加这些行
builde.gradle
dependencies {
testImplementation "com.example.module:database:$dbMigrationVersion"
}
应用程序测试.yml
spring:
飞行路线:
位置:classpath:/BOOT-INF/classes/db/migration
在这些行之后,从数据库
模块进行的所有迁移都将位于主
模块类路径中(在我们的测试概要文件中)。flyway可以在开始测试之前执行它们。第二种解决方案听起来更好。谢谢嗨,埃里克,我想做几乎相同的事情。您是否确实将:data项目创建为gradle项目?如果是这样,你能和我分享你的身材吗?哥们,你真是个救命稻草。我花了几个小时试图让一个文件跨两个模块加载,而不复制它,但无论我把它放在哪里,给它起什么名字,或者无论我如何从类路径加载它,每当执行从一个模块切换到另一个gradle模块时,我总是得到FileNotFoundException
。这解决了问题!很高兴它帮助了某人:)我尝试这个时堆栈溢出。在org.gradle.api.internal.file.DefaultSourceDirectorySet.getSrcDirTrees(DefaultSourceDirectorySet.java:128)和org.gradle.api.internal.file.DefaultSourceDirectorySet.doGetSrcDirTrees(DefaultSourceDirectorySet.java:141)@ToddiusZho创建了循环导入循环吗?项目1导入项目2和项目2导入项目1的位置?层次结构在gradle中非常重要,很容易产生循环循环。我认为这个答案现在已经过时了。根据最新的gradle版本,项目
类型上不存在源集
。能否详细说明将在何处放置synchronizeSharedResources函数和子项目块?在“源集”下的“数据”是否相同或不同:“数据”?gaaaa。我的王国,不使用关键字的问题。“sub-project-1”、“sub-project-2”和“myshared”应该没有歧义,我现在明白了。对于未来的读者,我认为它可以是任何东西。下面是用“花生酱”来展示它是如何成为任何东西的。sourceset{peanutbutter{resources{.and srcDirs+=[peanutbutter.resources]
dependencies {
testImplementation "com.example.module:database:$dbMigrationVersion"
}