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

根据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>

关键说明

  1. 自动激活逻辑:Profile会根据当前使用的JDK版本自动激活,无需手动指定-P参数。
  2. 依赖版本管理:如果你的项目通过dependencyManagement统一管理cxf-core、jaxb-runtime的版本,Profile中的依赖可以省略<version>标签,直接继承管理版本。
  3. 验证方法:执行mvn dependency:tree检查依赖树:
    • JDK8环境下,jakarta.xml.bind:jakarta.xml.bind-api应从依赖树中消失;
    • JDK11环境下,该依赖应正常存在。

补充:为什么之前的配置无效?

maven-compiler-plugin的排除参数作用于编译阶段的类文件过滤,比如排除某个jar包中的特定类不参与编译,但不会改变Maven的依赖解析结果——也就是说,该依赖依然会被打包到最终产物中,这就是你遇到部署错误的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 18:40:56