根据JDK版本排除Maven依赖的实现方案
解决JDK8/JDK11多版本构建时条件排除jakarta.xml.bind-api依赖的问题
你之前用maven-compiler-plugin的排除配置无效,是因为该插件的<excludeGroupIds>、<excludeArtifactIds>等参数是用于编译阶段排除特定类/源文件,而非管理依赖包的传递引入。要实现按JDK版本条件排除依赖,正确的做法是用Maven Profile结合依赖排除配置。
可行方案:基于JDK版本激活的Profile配置
通过定义两个Profile,分别对应JDK8和JDK11构建场景,自动激活并执行对应的依赖排除逻辑:
<profiles> <!-- JDK8构建时激活,排除jakarta.xml.bind-api依赖 --> <profile> <id>jdk8-build</id> <activation> <jdk>1.8</jdk> </activation> <dependencies> <!-- 对传递引入该依赖的cxf-core添加排除 --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-core</artifactId> <exclusions> <exclusion> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 同时排除jaxb-runtime传递的该依赖 --> <dependency> <groupId>org.glassfish.jaxb</groupId> <artifactId>jaxb-runtime</artifactId> <exclusions> <exclusion> <groupId>jakarta.xml.bind</groupId> <artifactId>jakarta.xml.bind-api</artifactId> </exclusion> </exclusions> </dependency> </dependencies> </profile> <!-- JDK11及以上构建时激活,保留依赖 --> <profile> <id>jdk11-build</id> <activation> <jdk>[11,)</jdk> </activation> <!-- 无需额外配置,默认保留所有依赖 --> </profile> </profiles>
关键说明
- 自动激活逻辑:Profile会根据当前使用的JDK版本自动激活,无需手动指定
-P参数。 - 依赖版本管理:如果你的项目通过
dependencyManagement统一管理cxf-core、jaxb-runtime的版本,Profile中的依赖可以省略<version>标签,直接继承管理版本。 - 验证方法:执行
mvn dependency:tree检查依赖树:- JDK8环境下,
jakarta.xml.bind:jakarta.xml.bind-api应从依赖树中消失; - JDK11环境下,该依赖应正常存在。
- JDK8环境下,
补充:为什么之前的配置无效?
maven-compiler-plugin的排除参数作用于编译阶段的类文件过滤,比如排除某个jar包中的特定类不参与编译,但不会改变Maven的依赖解析结果——也就是说,该依赖依然会被打包到最终产物中,这就是你遇到部署错误的原因。
内容的提问来源于stack exchange,提问作者wi2ard
相关产品推荐
相关产品推荐

