如何使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
相关产品推荐
相关产品推荐

