如何使用maven-war-plugin将指定类排除在Jar外但包含在War包中
解决方案
核心配置修改
你只需要在现有的maven-war-plugin配置中增加classesExcludes参数即可,该参数专门用于过滤attachClasses生成的classes jar包中的内容,且不会影响war包内的文件保留:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <configuration> <warName>copyLib</warName> <attachClasses>true</attachClasses> <classesClassifier>classes</classesClassifier> <!-- 新增配置:仅从classes分类器的jar中排除主类,war包不受影响 --> <classesExcludes> <!-- 替换为你实际的A项目主类全路径,用/分隔包名,后缀为.class --> com/xxx/AApplication.class <!-- 如果主类包含内部类,可调整为通配符格式:com/xxx/AApplication*.class --> </classesExcludes> <packagingExcludes> WEB-INF/lib/tomcat-*.jar, WEB-INF/lib/jetty-*.jar, WEB-INF/lib/websocket-*.jar, WEB-INF/lib/jakarta.websocket*.jar, WEB-INF/lib/javax-websocket*.jar, WEB-INF/lib/snakeyaml*.jar </packagingExcludes> </configuration> </plugin>
相关说明
classesExcludes是maven-war-plugin针对附加classes jar包的专用过滤配置,规则只作用于生成的xxx-classes.jar,war包的WEB-INF/classes下仍会保留你排除的主类文件,完全符合需求。- 之前使用
@Profile无效的原因是该注解是运行期生效的条件注解,打包阶段不会主动过滤类文件,主类仍然会被打进jar包中,只是运行时不触发初始化逻辑而已。
验证方式
打包完成后执行以下命令校验结果:
- 检查classes jar包是否已排除主类:
jar tf xxx-classes.jar | grep AApplication,无输出说明已排除 - 检查war包是否保留主类:
jar tf xxx.war | grep AApplication,有输出说明保留成功
内容的提问来源于stack exchange,提问作者Tim Paine
相关产品推荐
相关产品推荐

