如何从依赖JAR中排除指定文件?Apache Shade插件尝试无效
解决从Maven依赖JAR中排除单个文件的问题
问题分析
你遇到的No artifact matching filter org.acme.idm:idm-browser提示,核心原因是Shade插件的过滤器没有匹配到目标依赖Artifact——大概率是因为坐标不完整(缺少版本号),或者依赖的Scope不在插件默认处理范围内。
解决方案一:修正Shade插件的Filter配置
你的依赖未指定版本号(可能通过父POM或dependencyManagement统一管理),需要在过滤器中补充版本通配符,确保插件能匹配到该依赖:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <filters> <filter> <!-- 用*匹配任意版本号,若知道具体版本可直接替换 --> <artifact>org.acme.idm:idm-browser:*</artifact> <excludes> <exclude>real/form.ftl</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin>
如果目标依赖的Scope不是默认的compile(比如provided),需要在Shade配置中添加includeScope明确指定:
<configuration> <includeScope>provided</includeScope> <!-- 其他过滤器配置... --> </configuration>
解决方案二:用maven-dependency-plugin手动处理依赖
如果Shade插件仍然不生效,可以通过解压依赖→排除文件→重新打包的方式实现:
1. 解压目标依赖并排除指定文件
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.0</version> <executions> <execution> <id>unpack-target-dep</id> <phase>prepare-package</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.acme.idm</groupId> <artifactId>idm-browser</artifactId> <outputDirectory>${project.build.directory}/unpacked-dep</outputDirectory> <excludes>real/form.ftl</excludes> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>
2. 将处理后的文件加入打包产物
如果是JAR项目,配置maven-jar-plugin:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.3.0</version> <configuration> <classesDirectory>${project.build.directory}/unpacked-dep</classesDirectory> <!-- 保留项目自身的编译文件,需追加配置 --> <additionalResources> <additionalResource> <directory>${project.build.outputDirectory}</directory> </additionalResource> </additionalResources> </configuration> </plugin>
如果是WAR项目,调整为maven-war-plugin配置,将解压后的文件加入WEB-INF/classes目录即可。
验证方法
执行mvn clean package后,打开生成的JAR/WAR文件,检查real/form.ftl是否已被排除。
内容的提问来源于stack exchange,提问作者user1472409
相关产品推荐
相关产品推荐

