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

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),如何使它们依赖于一些公共资源(“数据”项目,它不包含代码,只包含资源),以及它们自己的独立资源 此

我正在用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项目依赖项即可)


非常感谢

好吧,我想出来了。其实很简单。只需将“数据”文件夹视为另一个项目,并向子项目添加依赖项声明即可。例如:

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