You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使myScripts子项目的Gradle任务依赖app子项目代码?

在Gradle多项目中让myScripts任务依赖app模块的类

你的思路完全没问题——只要myScripts仅依赖app而不是反向依赖,就不存在循环依赖,完全可以实现需求。下面是具体的配置步骤:

1. 确认多项目结构配置

先确保settings.gradle.kts中已经正确包含两个子项目:

include(":app", ":myScripts")

2. 给myScripts添加app模块的依赖

在myScripts/build.gradle.kts中,添加对app模块编译产物的依赖,让myScripts能访问到app的类:

dependencies {
    // 若需传递app的依赖用implementation;仅需app的类用compileOnly即可
    implementation(project(":app"))
}

3. 配置自定义任务的依赖与类路径

自定义任务必须先等待app模块完成编译,同时要把app的类路径加入到任务的类路径中,才能反射加载JPA实体。示例代码如下:

tasks.register<JavaExec>("generateSqlMigrations") {
    // 依赖app模块的编译任务,确保app的类已生成
    dependsOn(project(":app").tasks.named("compileJava"))

    // 合并myScripts自身和app模块的运行时类路径
    classpath = sourceSets.main.get().runtimeClasspath + project(":app").sourceSets.main.get().runtimeClasspath

    // 指定你写的SQL生成工具类的全限定名
    mainClass.set("com.your.myscripts.GenerateSqlMigrations")
}

4. 反射加载JPA实体的注意事项

  • 确保app模块的JPA实体类编译完整,注解和字节码信息未被篡改
  • 在myScripts的工具类中,使用类扫描库(比如Reflections)定位app模块的实体:
// 示例工具类代码,放在myScripts模块中
public class GenerateSqlMigrations {
    public static void main(String[] args) {
        // 替换成app模块中JPA实体所在的包路径
        Reflections reflections = new Reflections("com.your.app.entity");
        Set<Class<?>> entityClasses = reflections.getTypesAnnotatedWith(Entity.class);
        
        // 在这里编写生成SQL迁移文件的逻辑
        for (Class<?> entity : entityClasses) {
            // 处理实体类,生成对应的SQL语句
        }
    }
}

别忘了给myScripts添加Reflections的依赖:

dependencies {
    implementation("org.reflections:reflections:0.10.2")
}

完成以上配置后,运行./gradlew :myScripts:generateSqlMigrations就能执行自定义任务,且任务能正常加载app模块的JPA实体类。

内容的提问来源于stack exchange,提问作者Georgii Oleinikov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:05:26