gradle:排除制作 fatJar 的依赖

标签 gradle bouncycastle fatjar

关于如何从 fatJar 中排除单个文件有很多重复的答案。通常,文件被排除在 META-INF 中,并且由于文件名冲突,或者因为它是从依赖库文件复制的签名,该签名对新创建的 Jar 文件无效。

Maven 示例:
How can I tell which signed jar is causing maven-shade-plugin to fail?

gradle 示例:
Removing Jar Signatures in Gradle Build

但是,这些解决方案仅单独删除了有问题的文件。

我们如何制作一个排除了特定依赖库(而不是该库中的单个文件)的 fatJar?

例如,问题 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 文件的内容仍会复制到生成的胖 jar 中。

谢谢。动机是将我的 Java 应用程序发送到提供自己的安全库 BouncyCaSTLe(例如 Debian Linux)的系统,而不是嵌入该安全库的未签名副本。

最佳答案

不知道怎么样excludesincludes工作,但我希望这些配置在类文件级别上工作,因为 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'
    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
}

关于gradle:排除制作 fatJar 的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59642428/

相关文章:

android - Firebase 依赖项 : "WARNING: API ' variant. getMergeResources( )' is obsolete and has been replaced"

android - "Program type already present"是什么意思?

eclipse - 需要使用 gradle 构建文件从 eclipse 中排除依赖项

java - 寻找curl库的Java包装器

Android 在输出库中包含所有依赖项

gradle - Gradle:如何强制执行整个子树的版本?

ios - 使用 Crypto++ 和 Bouncy CaSTLe 使用 Serpent 进行加密和解密?

java - 使用 secp256r1 曲线 (BouncyCaSTLe) 生成长度为 127 的签名的 ECDSA 签名

scala - sbt 着色两个版本的依赖

apache-flink - Apache Flink 胖 JAR 的最大大小