gradle: исключить зависимость в создании fatJar - PullRequest
0 голосов
/ 08 января 2020

Существует множество повторных ответов о том, как исключить отдельный файл из fatJar. Как правило, исключаемый файл находится в META-INF и исключается либо из-за конфликта имен файлов, либо из-за того, что это подпись, скопированная из файла Jar зависимого libarar, который недопустим для вновь созданного файла Jar.

Пример для maven: Как определить, какой подписанный jar вызывает сбой maven-shade-plugin?

Пример для gradle: Удаление подписей Jar в Gradle Build

Эти решения, однако, только удаляли нарушающий файл по отдельности.

Как мы можем сделать fatJar с указанной библиотекой зависимостей c (не отдельными файлами в этой библиотеке ) исключен?

Например, в вопросе 36226033 легко исключить подпись, скопированную из BouncyCastle, но есть ли способ полностью исключить библиотеку зависимостей bcprov-jdk15on-*.jar, чтобы пользователь должен иметь библиотеку, доступную для выполнения сгенерированного жирного Jar?

Доказано, что это не работает:

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
                'Implementation-Version': version,
                'Main-Class': 'com.alphawallet.scripttool.Main'
    }
    baseName = project.name + '-all'
    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
    exclude('**/bcprov-jdk15on-1.62.jar')
    with jar
}

С exclude('**/bcprov-jdk15on-1.62.jar') содержимое этого файла JAR по-прежнему скопировал в сгенерированный жирный кувшин.

Спасибо. Мотивация - отправлять мое приложение Java в системы, которые предоставляют собственную библиотеку безопасности BouncyCastle (например, Debian Linux), вместо встраивания неподписанной копии этой библиотеки безопасности.

1 Ответ

1 голос
/ 08 января 2020

Я не знаю, как работают excludes и includes, но я ожидаю, что эти конфигурации работают на уровне файлов классов, потому что это то, над чем работает jar.

Это не работает на банки.

Я бы go для этого решения:

task fatJar(type: Jar) {
    manifest {
        attributes 'Implementation-Title': 'Gradle Jar File Example',
                'Implementation-Version': version,
                'Main-Class': 'com.alphawallet.scripttool.Main'
    }
    baseName = project.name + '-all'
    configurations.compile.findAll { file ->
        // file is of type java.io.File
        // when true, jar file is unziped and added 
        file.name != "bcprov-jdk15on-1.62.jar"
    }.sort { it.name }
            .collect { file ->
                logger.info("Including file: ${file.name}")
                file.isDirectory() ? file : zipTree(file)
            }
    with jar
}
...