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
相关产品推荐
相关产品推荐

