gradle无法从其他子项目解析依赖项目(“:app”)

5us2dqdw  于 2022-11-14  发布在  其他
关注(0)|答案(3)|浏览(297)

我是gradle的新手,还在努力理解它,所以如果你给予答案,请假设我不知道我在说什么。:)我使用的是gradle 7.3.3。
我有一个Android应用程序项目,它有标准的app模块。在我的app模块中有一个名为com.inadaydevelopment.herdboss.DatabaseConfigUtil的类,我希望能够运行DatabaseConfigUtil.main(),它需要在类路径中有来自app的所有类。
我创建了另一个名为libdbconfig的模块,它只是一个Java库模块,这样我就可以创建一个JavaExec任务,该任务将调用DatabaseConfigUtil.main(),并确保app中的所有类都在类路径中。
我的libdbconfig/build.gradle文件看起来像这样:

plugins {
    id 'java'
}

dependencies {
    implementation project(":app")
}

task dbconfig(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    mainClass = "com.inadaydevelopment.herdboss.DatabaseConfigUtil"
}

我将AndroidStudio与我的build.gradle更改同步,然后尝试运行libdbconfig:dbconfig任务,并得到错误:

* What went wrong:
Could not determine the dependencies of task ':libdbconfig:dbconfig'.

> Could not resolve all task dependencies for configuration ':libdbconfig:runtimeClasspath'.
   > Could not resolve project :app.

我认为我理解如何声明对另一个子项目的依赖关系,每当我看例子时(例11.声明项目依赖关系,看起来我做得很对。
如果我更改依赖项以删除单词“implementation”,gradle配置不会抛出错误,但我完全不理解,因为它没有将依赖项附加到配置(如“implementation”)。

dependencies {
    project(":app")
}

当我这样做时,gradle任务将启动,但最终会失败,因为app模块中的类不在类路径中,因此它无法找到要运行的类:

> Task :libdbconfig:dbconfig FAILED
Error: Could not find or load main class com.inadaydevelopment.herdboss.DatabaseConfigUtil
Caused by: java.lang.ClassNotFoundException: com.inadaydevelopment.herdboss.DatabaseConfigUtil

任何帮助都是感激的。gradle对我来说是巫毒教很长一段时间了,我正在努力弄清楚它。我参加了一个关于如何使用它的udacity课程,我认为我对它有了更好的理解,但是我认为我理解的一些基本东西并不起作用。

2cmtqfgy

2cmtqfgy1#

模块:app应配置自身;最好使用buildSrcincludeBuild。从一个库模块而不是另一个库模块访问任何东西都是一种反模式。如果你真的必须以一种奇怪的方式配置数据库,那么就在:app模块上应用一个自定义插件。我只是不明白为什么这个问题被标记为android,它读的是id 'java'而不是id 'com.android.library'
例如,添加buildSrc/build.gradle

buildscript {
    dependencies {
        classpath 'com.android.tools.build:gradle:7.2.1'
    }
    repositories {
        mavenCentral()
        google()
    }
}

apply plugin: 'org.gradle.java-gradle-plugin'

allprojects {
    repositories {
        mavenCentral()
        google()
    }
}

gradlePlugin {
    plugins {
        DbConfigPlugin {
            id = 'com.inadaydevelopment.herdboss.dbconfig'
            implementationClass = 'com.inadaydevelopment.herdboss.DbConfigPlugin'
        }
    }
}

dependencies {
    implementation gradleApi()
    implementation 'com.android.tools.build:gradle-api:7.2.1'

    testImplementation gradleTestKit()
    testImplementation 'org.junit.jupiter:junit-jupiter:5.8.2'
}

tasks.withType(Test).configureEach {
    useJUnitPlatform()
}

这样Gradle就可以在构建时执行Java代码:

class DbConfigPlugin implements Plugin<Project> {

    @Override
    public void apply(@NotNull Project project) {
        /* TODO: configure the database. */
    }
}

并可应用于:appbuild.gradle模块中:

plugins {
    id 'com.android.application'
    id 'com.inadaydevelopment.herdboss.dbconfig'
}

否则,您必须坚持使用Groovy或Kotlin脚本。

kokeuurv

kokeuurv2#

如果您尚未这样做,则需要将子项目包含在您的settings.gradle中,如下所示:

include "app"
include "libdbconfig"

您引用的示例适用于Gradle 7.4.2。也许可以看看这个适用于7.3.3的示例。

des4xlb0

des4xlb03#

最后,我能够以一种不同的方式运行我的main()方法和我的所有Android项目依赖项,我在Android Studio, generate Ormlite Configuration File (ormlite.txt), gradle complains "The JavaExec.main property has been deprecated."中详细描述了这种方式

相关问题