Gradle“条目.classpath是重复的,但没有设置重复处理策略”

Posted

技术标签:

【中文标题】Gradle“条目.classpath是重复的,但没有设置重复处理策略”【英文标题】:Gradle "Entry .classpath is a duplicate but no duplicate handling strategy has been set" 【发布时间】:2021-07-19 17:57:59 【问题描述】:

我正在尝试构建一个 gradle 项目,但是当我尝试 $ gradle build 时,我得到以下输出:

Starting a Gradle Daemon (subsequent builds will be faster)
> Task :jar FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':jar'.
> Entry .classpath is a duplicate but no duplicate handling strategy has been set. Please refer to https://docs.gradle.org/7.0/dsl/org.gradle.api.file.CopySpec.html#org.gradle.api.file.CopySpec:duplicatesStrategy for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 11s
4 actionable tasks: 2 executed, 2 up-to-date

在做了Get-ChildItem -Path ./ -Filter .classpath -Recurse -Force之后,我得出的结论是 我的项目中什至没有一个名为 .classpath 的文件。我该怎么办?

【问题讨论】:

如果您使用的是 linux 或 OSX,请尝试:find . -name .classpath -type f 在项目的根文件夹中 刚刚检查过这个。我的项目中没有.classpath 【参考方案1】:

类似于@korn 的回答,我使用EXCLUDE 策略解决了我的问题;

tasks.withType<Jar>() 

    duplicatesStrategy = DuplicatesStrategy.EXCLUDE

    manifest 
        attributes["Main-Class"] = "MainKt"
    

    configurations["compileClasspath"].forEach  file: File ->
        from(zipTree(file.absoluteFile))
    

【讨论】:

怎么会有冲突MERGED 排除策略有帮助,谢谢 排除策略救了我,谢谢!【参考方案2】:

如果您使用 Kotlin DSL 和 Gradle 7.0,可能是由于该错误 KT-46165 它应该在 1.5.0 版本中修复。

【讨论】:

【参考方案3】:

我在使用 kotlin 和 gradle 7 构建时遇到了同样的问题。解决这个问题,将以下代码添加到您的 build.gradle.kts

tasks.withType<Jar>  duplicatesStrategy = DuplicatesStrategy.INHERIT 

【讨论】:

【参考方案4】:

罐子 重复策略(重复策略。排除) .....

【讨论】:

【参考方案5】:

不知道你的情况与你甚至找不到的.classpath 文件有关(因为我知道这个文件通常是用我不使用的 Eclipse IDE 创建的)

但我在将 Spring Boot 应用程序升级到 Gradle 7.x 时遇到了同样的错误。 我的构建脚本有额外的资源处理任务来支持@..@ 样式的占位符(比如Spring Boot Maven build does,因为现在我支持项目中的两个构建系统并且我需要它们的行为相同):

processResources 
    with copySpec 
        from 'src/main/resources'
        include 'my-app*.yml'
        include 'my-app*.yaml'
        include 'my-app*.properties'
        project.properties.findAll().each 
            prop ->
                if (prop.value != null) 
                    filter(ReplaceTokens, tokens: [(prop.key): prop.value.toString()])
                
        
    

我在使用 Gradle 7 时遇到了同样的错误:

条目 my-app.properties 是重复的,但未设置重复处理策略。详情请参考https://docs.gradle.org/7.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy。

而且,确实存在重复。 Gradle 首先将未处理的文件复制到build/resources/main,然后尝试执行我的自定义processResources 并将文件再次复制到同一位置。

解决方案是将duplicatesStrategy = 'include' 添加到with copySpec 块。看起来之前 Gradle 默默地覆盖了副本,所以没有问题。

【讨论】:

以上是关于Gradle“条目.classpath是重复的,但没有设置重复处理策略”的主要内容,如果未能解决你的问题,请参考以下文章

简单理解Gradle,Gradle是什么,一分钟入门Gradle

GroovyGradle 环境搭建 ( 下载 Gradle 工具 | 查找本地缓存的 Gradle 工具 | 配置 Gradle 环境变量 )

Android Gradle 插件Gradle 构建工具简介 ① ( Gradle 环境配置 | 官网下载 Gradle 软件包 | 在本地用户目录下查找 | 配置 Gradle 环境变量 )

Android Gradle 插件Gradle 依赖管理 ① ( org.gradle.api.Project 配置 | Android Gradle 插件配置与 Gradle 配置关联 ) ★

gradle wrapper, gradle ,gradle plugin 之间的关系

Gradle与Gradle插件