Apache Maven Shade Plugin是否有去重合并文本文件的Transformer?
Apache Maven Shade 资源合并去重与HTTP Client兼容性问题解答
1. 实现带去重功能的Resource Transformer
Maven Shade Plugin默认没有自带合并同名文本并自动去重的Transformer,但你可以自定义一个来满足需求:
自定义Transformer实现
编写一个实现org.apache.maven.plugins.shade.resource.ResourceTransformer接口的类,核心逻辑是把所有目标文件的行存入HashSet自动去重,最后输出合并后的内容。示例代码如下:
import org.apache.maven.plugins.shade.resource.ResourceTransformer; import java.io.*; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.JarOutputStream; public class DedupingPublicSuffixTransformer implements ResourceTransformer { private final Set<String> uniqueLines = new HashSet<>(); private static final String TARGET_FILE = "mozilla/public-suffix-list.txt"; @Override public boolean canTransformResource(String resource) { return TARGET_FILE.equals(resource); } @Override public void processResource(String resource, InputStream is, List<Relocator> relocators) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { String line; while ((line = reader.readLine()) != null) { // 保留注释行,同时自动去重重复条目 uniqueLines.add(line); } } } @Override public void modifyOutputStream(JarOutputStream jos) throws IOException { if (!uniqueLines.isEmpty()) { jos.putNextEntry(new ZipEntry(TARGET_FILE)); try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(jos))) { uniqueLines.forEach(writer::println); } } } @Override public boolean hasTransformedResource() { return !uniqueLines.isEmpty(); } // 其他未实现方法返回默认值即可 @Override public void finish() {} }
在父POM中配置Shade Plugin
将自定义Transformer配置到Shade插件中,确保插件能加载到这个类(可以把Transformer打包成独立依赖,或者放在父POM所在项目的源码中):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 使用自定义去重Transformer --> <transformer implementation="com.yourorg.DedupingPublicSuffixTransformer"/> <!-- 按需添加其他Transformer,比如Manifest文件处理 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.yourorg.MainClass</mainClass> </transformer> </transformers> </configuration> </execution> </executions> <!-- 如果Transformer是独立依赖,需要引入 --> <dependencies> <dependency> <groupId>com.yourorg</groupId> <artifactId>shade-transformers</artifactId> <version>1.0.0</version> </dependency> </dependencies> </plugin>
2. 直接合并重复条目的兼容性
你猜测的完全正确:Apache HTTP Client在加载public-suffix-list.txt时,会将所有条目存入Set集合(内部用HashSet实现),天然会自动去重重复条目。所以即使你直接用AppendingTransformer合并所有同名文件,保留大量重复行,也不会导致HTTP Client出现功能异常——唯一的影响只是启动时加载文件的时间略有增加,完全在可接受范围内。
如果不想自定义Transformer,直接用默认的AppendingTransformer合并也是可行的方案。
内容的提问来源于stack exchange,提问作者Garret Wilson
相关产品推荐
相关产品推荐

