Gradle “Entry .classpath es un duplicado pero no se ha establecido una estrategia de manejo de duplicados”

4 minutos de lectura

avatar de usuario de 136
136

Estoy tratando de construir un proyecto gradle pero, cuando intento $ gradle build Obtengo el siguiente resultado:

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

Después de hacer Get-ChildItem -Path ./ -Filter .classpath -Recurse -Force Llegué a la conclusión de que ni siquiera tengo un solo archivo llamado .classpath en mi proyecto ¿Qué debo hacer?

  • Si está en Linux u OSX, intente: find . -name .classpath -type f en la carpeta raíz de tu proyecto

    – tim_yates

    26 de abril de 2021 a las 10:57

  • Acabo de comprobar esto. no tengo ninguno .classpath en mi proyecto

    – 136

    26 de abril de 2021 a las 11:19

  • También tenga en cuenta que si el error se trata de un Entry classpath.index en lugar de .classpath (Google muestra esta pregunta como primera respuesta entonces), es un problema causado por intellij. ver: github.com/gradle/gradle/issues/17236. La “entrada” es en realidad un archivo que existe con el mismo nombre en diferentes carpetas, esto no queda muy claro en el mensaje de error.

    – Daniel Alder

    10 de enero a las 10:06


  • @DanielAlder, gracias por tu comentario. Me ayudó mucho. Tuve exactamente este problema.

    – Sr. BoFrost

    12 de enero a las 8:19

Similar a la respuesta de @korn, resolví la mía usando el EXCLUDE Estrategia;

tasks.withType<Jar>() {

    duplicatesStrategy = DuplicatesStrategy.EXCLUDE

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

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

  • como pueden ser los conflictos MERGED?

    – oraciónagupa

    14/09/2021 a las 22:44

  • Agregado duplicatesStrategy = DuplicatesStrategy.EXCLUDE ¡y funciona! ¡Magia!

    – Benone

    27 de noviembre de 2022 a las 11:59

Avatar de usuario de Marina Mikilchenko
Marina Mikilchenko

jar {
   duplicatesStrategy(DuplicatesStrategy.EXCLUDE)
}

  • Para las personas que usan el complemento Spring Boot: reemplazar jar con bootJar.

    – nuevo

    15 de marzo a las 11:49

Avatar de usuario de Morteza
Morteza

por favor agrega esto

tasks.withType(Copy).all { duplicatesStrategy 'exclude' }

En el build.gradle el archivo luego lo resolvió.

  • Por favor, evite comenzar una respuesta con Tengo el mismo problema porque corre el riesgo de que lo marquen como No es una respuesta. En su lugar, utilice un texto más afirmativo como Para resolver el problema debes …..

    –Steve

    20 de junio de 2022 a las 9:49

  • tareas.withType no funciona para mí, esta copia sí

    – Mía

    25 de noviembre de 2022 a las 9:13

Enfrenté el mismo problema mientras construía con kotlin y gradle 7. Resuelva el problema agregando el siguiente código a su build.gradle.kts.

tasks.withType<Jar> { duplicatesStrategy = DuplicatesStrategy.INHERIT }

Si usa Kotlin DSL y Gradle 7.0, puede deberse a ese error KT-46165
Debería arreglarse en la versión 1.5.0.

Avatar de usuario de wprogLK
wprogLK

Estaba teniendo los mismos problemas al ejecutar algunas pruebas en IntelliJ. Lo que me ayudó fue ejecutar un simple gradle clean.

Avatar de usuario de Kirill
cirilo

No sé acerca de su caso con .classpath archivo que ni siquiera puede encontrar (como sé, este archivo generalmente se crea con Eclipse IDE que no uso)

Pero me encontré con el mismo error al actualizar la aplicación Spring Boot a Gradle 7.x. Mi script de compilación tenía una tarea de procesamiento de recursos adicionales para admitir @..@marcadores de posición de estilo (como La compilación Spring Boot Maven síporque por ahora admito ambos sistemas de compilación en el proyecto y necesito que se comporten de la misma manera):

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()])
                }
        }
    }
}

Recibí el mismo error con Gradle 7:

La entrada my-app.properties es un duplicado, pero no se ha establecido una estrategia de manejo de duplicados. Por favor refiérase a https://docs.gradle.org/7.1/dsl/org.gradle.api.tasks.Copy.html#org.gradle.api.tasks.Copy:duplicatesStrategy para detalles.

Y, de hecho, hay un duplicado. Gradle primero copia el archivo sin procesar a build/resources/main y luego intenta ejecutar mi costumbre processResources y copie los archivos nuevamente en el mismo lugar.

La solución fue agregar duplicatesStrategy = 'include' a with copySpec {} bloquear. Parece que anteriormente Gradle sobrescribió silenciosamente el duplicado, por lo que no hubo ningún problema.

¿Ha sido útil esta solución?