簡體   English   中英

gradle 無法從其他子項目解析依賴項目(“:app”)

[英]gradle cannot resolve dependecy project(":app") from other sub-project

我是 gradle 的新手,仍然試圖理解它,所以如果你給出答案,請假設我不知道我在說什么。:) 我使用的是 gradle 7.3.3。

我有一個具有標准app模塊的 Android 應用程序項目。 在我的app模塊中是一個名為com.inadaydevelopment.herdboss.DatabaseConfigUtil的 class ,我希望能夠運行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.Declaring project dependencies看起來我做對了。

如果我更改我的依賴項以刪除“實施”一詞,那么 gradle 配置不會引發錯誤,但我根本不明白,因為它沒有將依賴項附加到配置(如“實施”)。

dependencies {
    project(":app")
}

當我這樣做時,gradle 任務將啟動,但最終會失敗,因為來自app模塊的類不在類路徑中,因此它找不到要運行的 class:

> 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 課程,我認為我對它有了更好的理解,但是我認為我理解的一些基本內容不起作用。

如果您還沒有這樣做,您需要在settings.gradle中包含您的子項目,如下所示:

include "app"
include "libdbconfig"

您引用的示例適用於 Gradle 7.4.2。 也許看看這個例子 7.3.3

模塊: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. */
    }
}

它可以應用在模塊中:app build.gradle

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

否則,您必須堅持使用 Groovy 或 Kotlin 腳本。

我無法得到馬丁的答案,但我會給他賞金,因為他付出了很多努力來試圖給出一個好的答案。

最后,我能夠以不同的方式運行我的所有 android 項目依賴項的 main() 方法的方式,我在Android Studio 中詳細描述過,生成 Ormlite 配置文件 (ormlite.txt),Z8ED1A771BC236C27ZAD9 “JavaExec.main 屬性已被棄用。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM