Gradle 在执行自定义任务时找不到模块的输出 jar

Posted

技术标签:

【中文标题】Gradle 在执行自定义任务时找不到模块的输出 jar【英文标题】:Gradle cannot find module's output jar when executing custom task 【发布时间】:2018-04-19 07:46:57 【问题描述】:

我有一个包含三个模块的 Gradle 项目,每个模块都嵌套依赖于下一个:

android app module, which depends on...
   android lib module, which depends on ...
      java lib module (called core)

在我的 lib 模块中,我正在尝试创建一个自定义任务(生成 javadocs,但这可能不相关)

库/build.gradle:

apply plugin: 'com.android.library'

android 
    ...


android.libraryVariants.all  variant ->
    task("$variant.nameDocs", type: Javadoc) 
        failOnError true
        source = variant.javaCompiler.source
        classpath = files(((Object) android.bootClasspath.join(File.pathSeparator)))
        classpath += files(variant.javaCompiler.classpath.files) // THIS LINE IS CAUSING ERROR
    


dependencies 
    implementation project(':core')
    ...

问题是,当我运行任何 Gradle 任务(甚至 Gradle clean)时,我收到一个关于找不到 core.jar 的错误

org.gradle.api.ProjectConfigurationException:出现问题 配置项目':library'。

原因: org.gradle.api.artifacts.transform.ArtifactTransformException:失败 转换文件'core.jar'以匹配属性 artifactType=android-classes 使用转换 JarTransform

原因:org.gradle.api.InvalidUserDataException:转换输出 文件 ******/core/build/libs/core.jar 不存在。

我猜这是因为 Gradle 在配置阶段正在寻找库的类路径(包括 core.jar)所需的所有文件。但为什么呢?

    为什么 gradle 不只在执行期间解决依赖关系? (即为什么我会在 每个 gradle 任务中看到这个错误?)

    如何告诉 gradle 在执行此自定义任务之前构建 core.jar?

【问题讨论】:

【参考方案1】:

因为 variant.javaCompiler.classpath.files 已经是文件类型。 你可以试试这两种说法:

classpath += variant.javaCompiler.classpath.files

或者正如你之前提到的:

classpath += files(variant.javaCompiler.classpath)

【讨论】:

【参考方案2】:

我真的不知道为什么会这样,但只需从问题行中删除 .files 即可解决问题:

classpath += files(variant.javaCompiler.classpath)

【讨论】:

【参考方案3】:

在我的情况下,文件的文件名(文件名)有错字,因此请检查文件名和您正在编写的依赖项以确保它们完全相同。

【讨论】:

以上是关于Gradle 在执行自定义任务时找不到模块的输出 jar的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件自定义 Gradle 任务 ② ( 在 Terminal 面板中执行 gradlew task 命令显示所有任务 | 命令行输出所有任务 | 单独执行指定任务 )

Android Gradle 插件自定义 Gradle 任务 ⑫ ( Gradle 任务的输出和输出 | @Optional 注解 | UP-TO-DATE 避免重复执行任务 )

S7200编程时找不到添加模似量模块设置

在 next-auth 中制作自定义电子邮件登录页面时找不到“next-auth/react”模块

使用Android studio创建的AIDL编译时找不到自定义类的解决办法

导入具有导出枚举的模块时找不到模块错误