tasks.register("verifyNoDuplicateClasses") { group = "verification" description = "Checks the project for duplicate classes across all dependencies." doLast { val classFileNames = mutableSetOf<String>() val duplicatesClassFileNames = mutableSetOf<String>() val classFileNamesToJars = mutableMapOf<String, MutableList<String>>() configurations.runtimeClasspath.get().resolvedConfiguration.resolvedArtifacts.forEach { artifact -> val jarFile = JarFile(artifact.file) jarFile.entries().iterator() .forEach { entry -> if (entry.name.endsWith(".class") && entry.name.endsWith("module-info.class").not() ) { val classFileName = entry.name classFileNamesToJars.getOrPut(classFileName) { mutableListOf() } .add(artifact.file.name) if (classFileNames.contains(classFileName)) { duplicatesClassFileNames.add(classFileName) } else { classFileNames.add(classFileName) } } } jarFile.close() } if (duplicatesClassFileNames.isNotEmpty()) { println("Found duplicate classes:") duplicatesClassFileNames.forEach { duplicate -> println("- $duplicate is in ${classFileNamesToJars[duplicate]}") } throw GradleException("${duplicatesClassFileNames.size} Duplicate classes found. Refer to output to see more details. You can run 'gradle dependencies' to have more details on the dependencies.") } else { println("No duplicate classes found.") } } }