Я использую некоторые библиотеки в своем проекте Gradle, в которых также есть другие библиотеки и так далее. В результате я получаю много дубликатов файлов в моем окончательном JAR, например, несколько LICENSE
файлов или несколько javax
пакетов.
Я уже нашел способ исключить определенные файлы:
jar {
from {
configurations.embed.collect {
exclude '.project'
exclude '.classpath'
exclude 'about.html'
exclude 'LICENSE'
exclude 'NOTICE'
exclude 'LICENSE.txt'
exclude 'NOTICE.txt'
exclude 'META-INF/*'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/DEPENDENCIES'
it.isDirectory() ? it : zipTree(it)
}
}
}
Это прекрасно работает, однако есть также множество дублированных классов, например ::10000
:reobfJar FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':reobfJar'.
> java.util.zip.ZipException: duplicate entry: javax/annotation/CheckForNull.class
Я хотел бы спросить, как исключить целый каталог, например javax/
, но я думаю, что классы, которые содержит этот каталог, могут быть важны для некоторых библиотек, которые я использую. Итак, мой вопрос:
как мне правильно решить проблему с «повторяющейся записью» в Gradle?
Есть ли способ, например, просто пропустить эту ошибку и просто игнорировать файлы, которые уже присутствуют в JAR или что-то в этом роде?
Весь мой build.gradle
файл:
buildscript {
repositories {
jcenter()
maven {
name = "forge"
url = "http://files.minecraftforge.net/maven"
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
}
}
repositories {
mavenLocal()
mavenCentral()
}
apply plugin: 'net.minecraftforge.gradle.forge'
version = "1.0.0"
group = "club.pvpnation.forgemod"
archivesBaseName = "pvpn-mod"
sourceCompatibility = 1.8
targetCompatibility = 1.8
minecraft {
version = "1.8.9-11.15.1.2318-1.8.9"
runDir = "run"
// the mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD snapshot are built nightly.
// stable_# stables are built at the discretion of the MCP team.
// Use non-default mappings at your own risk. they may not allways work.
// simply re-run your setup task after changing the mappings to update your workspace.
mappings = "stable_20"
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
}
configurations {
embed
compile.extendsFrom embed
}
dependencies {
// Embed in JAR
embed group: 'org.reflections', name: 'reflections', version: '0.9.10'
embed group: 'me.darksidecode.kantanj', name: 'kantanj', version: '1.0.0'
// Annotation Processors
/* annotationProcessor - Gradle 5+ */ compile group: 'org.projectlombok', name: 'lombok', version: '1.18.6'
}
processResources {
// this will ensure that this task is redone when the versions change.
inputs.property "version", project.version
inputs.property "mcversion", project.minecraft.version
// replace stuff in mcmod.info, nothing else
from (sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version':project.version, 'mcversion':project.minecraft.version
}
// copy everything else, thats not the mcmod.info
from (sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
}
}
// https://gist.github.com/matthewprenger/9b2da059b89433a01c1c
task signJar(type: SignJar, dependsOn: reobfJar) {
// gradle.properties
keyStore = project.keyStore // This needs to be a path to the keystore file
alias = project.keyStoreAlias
storePass = project.keyStorePass
keyPass = project.keyStoreKeyPass
inputFile = jar.archivePath
outputFile = jar.archivePath
}
//noinspection GrUnresolvedAccess
build.dependsOn signJar
// Include dependencies in JAR
jar {
from {
configurations.embed.collect {
exclude 'javax'
exclude '.project'
exclude '.classpath'
exclude 'about.html'
exclude 'LICENSE'
exclude 'NOTICE'
exclude 'LICENSE.txt'
exclude 'NOTICE.txt'
exclude 'META-INF/*'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/DEPENDENCIES'
it.isDirectory() ? it : zipTree(it)
}
}
}