buildSrc:无法为 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象获取未知 属性

buildSrc: Could not get unknown property for object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler

我正在尝试重组此 Android (Java based) library to use the buildSrc folder to define all versions and dependencies as described in this article

我已经为 Kotlin 基础项目成功设置了好几次。这次的项目是纯Java.

buildSrc 文件夹中,我创建了以下 buildSrc/src/main/java/org/ligi/snackengage/Dependencies.java 文件:

package org.ligi.snackengage;

public class Dependencies {

    public static class Android { /* ... */ }

    public static class GradlePlugins {
        public static final String ANDROID = "com.android.tools.build:gradle:3.6.3";
        // ...
    }

    public static class Libs { /* ... */ }

}

然后我参考项目根目录中的定义build.gradle等等:

import org.ligi.snackengage.Dependencies.GradlePlugins

apply plugin: "com.github.ben-manes.versions"

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath GradlePlugins.ANDROID
        classpath GradlePlugins.MAVEN
        classpath GradlePlugins.VERSIONS
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

这里是work in progress branch。当我构建项目时出现以下错误:

* Where:
Build file 'SnackEngage/build.gradle' line: 12

* What went wrong:
A problem occurred evaluating root project 'SnackEngage'.
> Could not get unknown property 'GradlePlugins' for object of type
  org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.

这里是 build log.

您需要先用 def(在 Gradle 中)或 public class GradlePlugins(在 Java 中)定义变量 GradlePlugins,然后再尝试访问它。 Kotlin class GradlePlugins 也应该可以工作。

dependencies {
    classpath GradlePlugins.ANDROID
    classpath GradlePlugins.MAVEN
    classpath GradlePlugins.VERSIONS
}

而且我认为 buildSrc 目录属于模块目录,如 Gradle 手册所示。

您已将 GradlePlugins class 定义为 Dependencies 的内部静态 class,因此您需要使用 Dependencies.GradlePlugins 从您的构建中访问它脚本。

按如下方式更改您的依赖项块:

import org.ligi.snackengage.Dependencies // do not import org.ligi.snackengage.Dependencies.GradlePlugins
buildscript {
    // ...
    dependencies {
        classpath Dependencies.GradlePlugins.ANDROID
        classpath Dependencies.GradlePlugins.MAVEN
        classpath Dependencies.GradlePlugins.VERSIONS
    }
}

EDIT 您也可以使用静态导入,如下所示:

import static org.ligi.snackengage.Dependencies.*
buildscript {
    // ...
    dependencies {
        classpath GradlePlugins.ANDROID
        classpath GradlePlugins.MAVEN
        classpath GradlePlugins.VERSIONS
    }
}