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 配置关联 ) ★