处理着色(uber / fat)jar文件中的重复条目

时间:2016-03-02 20:53:48

标签: java gradle jar classloader gradle-shadow-plugin

我创建了一个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,但它也没有给我一些线索。

1 个答案:

答案 0 :(得分:2)

maven-shade-plugin中,这是通过AppendingTransformer完成的。

我对你使用的gradle插件documentation的解释是这样做的:

shadowJar {
  append('META-INF/spring.factories')
}