我创建了一个jar文件,由多个jar创建(在本例中我使用了Gradle Shadow插件)。
原来,该文件包含/META-INF
中的重复文件。它们中的大多数都是来自原始jar文件的多个license.txt
,但其中一些是Spring工厂,我很感兴趣。
当使用与Maven或Gradle类似的各种类似fatjar的工具时,这种行为似乎很常见,并且看起来它不会被任何方式禁止。
我已经检查过java.lang.ClassLoader#getResources
会将这些条目作为相同网址的列表返回,例如:
jar:file:/C:/temp/myJar.jar!/META-INF/spring.factories
jar:file:/C:/temp/myJar.jar!/META-INF/spring.factories
所以一旦我获得了URL,就无法以编程方式获取所有重复文件的内容。
Java可以以某种方式处理这样的重复文件吗?
或者,或许更一般,从规格的角度来看,它是一个有效且受支持的情况,是否有一个包含重复文件的jar?我已经检查了Jar File Specification,但它也没有给我一些线索。
答案 0 :(得分:2)
在maven-shade-plugin
中,这是通过AppendingTransformer完成的。
我对你使用的gradle插件documentation的解释是这样做的:
shadowJar {
append('META-INF/spring.factories')
}