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

Maven扩展如何获取Assembly构件的classifier/ID?

解决Maven扩展获取Assembly构件Classifier的问题

嗨,这个问题我之前也踩过坑!Assembly插件生成的构件确实有点“特殊”,常规的getAttachedArtifacts()+getClassifier()组合有时候拿不到想要的信息,核心原因是Assembly构件的元数据同步时机和普通附加构件不太一致,尤其是在afterSessionEnd阶段,部分信息可能还没完全写入Maven的项目模型里。下面给你几个可行的解决方案:

方案1:直接从Assembly插件的执行结果中提取

Assembly插件执行完成后,会把生成的构件信息存在自身的执行结果里,我们可以通过遍历项目的插件执行记录来获取:

// 遍历当前项目的所有插件
for (MavenPlugin plugin : project.getBuildPlugins()) {
    // 定位到maven-assembly-plugin
    if ("org.apache.maven.plugins".equals(plugin.getGroupId()) 
        && "maven-assembly-plugin".equals(plugin.getArtifactId())) {
        // 遍历插件的所有执行实例
        for (PluginExecution execution : plugin.getExecutions()) {
            // 获取执行后生成的附加构件列表
            List<Artifact> assemblyArtifacts = execution.getResult().getAttachedArtifacts();
            for (Artifact artifact : assemblyArtifacts) {
                // 这里就能拿到完整的GAVC信息了
                System.out.printf("Assembly构件:%s:%s:%s:%s%n",
                    artifact.getGroupId(),
                    artifact.getArtifactId(),
                    artifact.getClassifier(),
                    artifact.getType());
            }
        }
    }
}

方案2:监听Assembly插件的执行完成事件

如果在afterSessionEnd阶段拿不到可靠的数据,不如提前一步,在Assembly插件执行完成时直接捕获构件信息,这种方式更精准:

public class AssemblyArtifactCollector extends AbstractMavenLifecycleParticipant {
    @Override
    public void afterSessionStart(MavenSession session) throws MavenExecutionException {
        // 注册插件执行事件监听器
        session.getEventDispatcher().addEventListener(new AbstractEventListener() {
            @Override
            public void onEvent(MavenEvent event) {
                if (event instanceof PluginExecutionEvent) {
                    PluginExecutionEvent pluginEvent = (PluginExecutionEvent) event;
                    MavenPlugin plugin = pluginEvent.getPlugin();
                    // 只关注maven-assembly-plugin的执行完成事件
                    if ("org.apache.maven.plugins".equals(plugin.getGroupId())
                        && "maven-assembly-plugin".equals(plugin.getArtifactId())
                        && EventType.AFTER_EXECUTION.equals(pluginEvent.getType())) {
                        // 提取构件信息,可以暂存起来到afterSessionEnd阶段使用
                        List<Artifact> assemblyArtifacts = pluginEvent.getPluginExecution().getResult().getAttachedArtifacts();
                        for (Artifact artifact : assemblyArtifacts) {
                            System.out.println("捕获到Assembly构件:" + artifact.getId());
                        }
                    }
                }
            }
        });
    }
}

方案3:通过构件文件名反推Classifier

如果上面两种方式都受限于环境无法使用,还可以通过构件文件的命名规则来反推Classifier——Assembly生成的文件通常遵循artifactId-version-classifier.type的格式:

for (Artifact artifact : project.getAttachedArtifacts()) {
    File artifactFile = artifact.getFile();
    if (artifactFile == null) continue;
    
    String fileName = artifactFile.getName();
    // 拆分文件名(比如:my-app-1.0-dist.zip)
    String[] nameParts = fileName.split("\\.");
    if (nameParts.length < 2) continue;
    
    String baseName = nameParts[0];
    String[] baseParts = baseName.split("-");
    // 确保有足够的拆分部分
    if (baseParts.length >= 3) {
        String inferredClassifier = baseParts[baseParts.length - 1];
        String type = nameParts[1];
        // 验证类型是否匹配
        if (type.equals(artifact.getType())) {
            System.out.printf("推断的Classifier:%s%n", inferredClassifier);
        }
    }
}

注意事项

  • 如果你用方案1或2,需要确保你的Maven扩展依赖中包含maven-assembly-plugin的API,否则可能无法访问插件执行结果的相关类;
  • 优先选择方案2,因为它能在构件生成的第一时间捕获信息,避免后续阶段元数据丢失的问题。

内容的提问来源于stack exchange,提问作者rgaduputi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:03:19