gradle: 排除制作 fatJar 的依赖
gradle: exclude a dependency in making fatJar
关于如何从 fatJar 中排除单个文件,有很多重复的答案。通常,文件被排除在 META-INF 中,它们被排除是因为文件名冲突,或者是因为它是从对新创建的 Jar 文件无效的依赖库 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
,这样用户一定有可用于执行生成的 fat 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 文件的内容仍被复制到生成的 fat jar 中。
谢谢。动机是将我的 Java 应用程序发送到提供自己的安全库 BouncyCastle 的系统(例如 Debian Linux),而不是嵌入该安全库的未签名副本。
我不知道 excludes
和 includes
是如何工作的,但我希望这些配置在 class 文件级别上工作,因为 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
}
关于如何从 fatJar 中排除单个文件,有很多重复的答案。通常,文件被排除在 META-INF 中,它们被排除是因为文件名冲突,或者是因为它是从对新创建的 Jar 文件无效的依赖库 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
,这样用户一定有可用于执行生成的 fat 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 文件的内容仍被复制到生成的 fat jar 中。
谢谢。动机是将我的 Java 应用程序发送到提供自己的安全库 BouncyCastle 的系统(例如 Debian Linux),而不是嵌入该安全库的未签名副本。
我不知道 excludes
和 includes
是如何工作的,但我希望这些配置在 class 文件级别上工作,因为 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
}