You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:13:18