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

4

我正在尝试重新组织这个基于Java的Android库,以使用buildSrc文件夹来定义所有版本和依赖项,如此文章所述。

我已经成功地为几个基于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()
    }
}

这里是正在进行中的分支。当我构建项目时,会出现以下错误:

* 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.

这里是构建日志
2个回答

2

您已将GradlePlugins类定义为Dependencies的内部静态类,因此您需要使用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
    }
}

编辑 你也可以使用静态导入,如下所示:

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

1
谢谢。非常好用,查看[PR#45](https://github.com/ligi/SnackEngage/pull/45)。 - JJD

0
你需要在访问 GradlePlugins 变量之前,使用 def(在 Gradle 中)或者 public class GradlePlugins(在 Java 中)进行定义。Kotlin 中的 class GradlePlugins 也可以工作。
dependencies {
    classpath GradlePlugins.ANDROID
    classpath GradlePlugins.MAVEN
    classpath GradlePlugins.VERSIONS
}

我认为buildSrc目录应该放在模块目录中,就像Gradle手册所示。


我不确定您想让我更改什么。请查看我链接的代码片段或原始源代码。请注意,该项目是纯Java而非Kotlin。 - JJD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接