Apache CXF依赖树随JDK版本变化的原因探究
Apache CXF在不同JDK版本下依赖树差异的原因解析
你观察到的CXF 3.5.5在JDK 8和JDK 16下依赖树的差异,核心原因并非CXF自身配置了JDK相关的Maven Profile或Enforcer插件,而是Maven依赖解析机制结合JDK版本变化、传递依赖的条件激活共同作用的结果,以下具体拆解:
1. JDK版本升级导致的API缺失
JDK 9及以后版本(包括JDK 16)移除了原JDK 8中自带的Java EE相关API(如JTA、JAX-WS、JAXB等,这些原属于rt.jar)。在JDK 8环境下,Maven无需引入这些API的依赖,因为JDK本身提供;但在JDK 16环境下,这些API不再内置,因此依赖链中的组件会自动引入对应的兼容实现或API包。
2. 传递依赖的条件激活
你看到的geronimo-jta_1.1_spec这类依赖,是通过CXF的传递依赖链引入的:CXF依赖的某个组件(如Jakarta EE相关的API或实现库)的POM文件中,配置了基于JDK版本的激活规则。例如:
- 部分库会通过Maven Profile的
<activation>节点,指定当JDK版本≥9时,自动激活并引入缺失的Java EE API依赖; - 或者通过
maven-compiler-plugin的source/target参数,结合依赖的optional属性,在高JDK版本下自动解析并引入这些依赖。
以geronimo-jta_1.1_spec为例,它是JTA 1.1规范的实现,JDK 8中JTA API由JDK内置,无需额外依赖;但JDK 16移除了该API,因此CXF依赖的某个组件(比如Jakarta EE相关的核心库)会在高JDK环境下自动引入这个规范实现,确保代码编译和运行的兼容性。
3. 验证依赖来源的方法
如果你想确认具体是哪个依赖引入了geronimo-jta_1.1_spec,可以在JDK 16环境下执行以下Maven命令,追踪依赖链:
mvn dependency:tree -Dverbose -Dincludes=org.apache.geronimo.specs:geronimo-jta_1.1_spec
该命令会输出这个依赖的完整传递路径,帮你定位到触发它的上游依赖。
附:JDK 8 vs JDK 16依赖树差异
JDK 8依赖树
[INFO] org.apache.cxf:cxf-core:bundle:3.5.5 [INFO] +- junit:junit:jar:4.13.2:test [INFO] | \- org.hamcrest:hamcrest-core:jar:2.2:test [INFO] | \- org.hamcrest:hamcrest:jar:2.2:test [INFO] +- org.easymock:easymock:jar:5.0.1:test [INFO] | \- org.objenesis:objenesis:jar:3.3:test [INFO] +- jakarta.validation:jakarta.validation-api:jar:2.0.2:compile (optional) [INFO] +- org.ow2.asm:asm:jar:9.4:compile (optional) [INFO] +- xml-resolver:xml-resolver:jar:1.2:compile (optional) [INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.5:compile [INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.5:compile [INFO] | +- com.sun.istack:istack-commons-runtime:jar:3.0.12:compile [INFO] | \- com.sun.activation:jakarta.activation:jar:1.2.2:runtime [INFO] +- org.slf4j:slf4j-api:jar:1.7.36:compile (optional) [INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.36:test [INFO] +- org.slf4j:jcl-over-slf4j:jar:1.7.36:test [INFO] +- cglib:cglib-nodep:jar:3.3.0:provided [INFO] +- com.fasterxml.woodstox:woodstox-core:jar:6.4.0:compile [INFO] | \- org.codehaus.woodstox:stax2-api:jar:4.2.1:compile [INFO] +- org.springframework:spring-beans:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-core:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-jcl:jar:5.3.22:compile (optional) [INFO] +- org.springframework:spring-context:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-expression:jar:5.3.22:compile (optional) [INFO] +- org.springframework:spring-aop:jar:5.3.22:provided (optional) [INFO] +- org.apache.aries.blueprint:org.apache.aries.blueprint.core:jar:1.10.3:provided (optional) [INFO] | +- org.apache.aries.blueprint:org.apache.aries.blueprint.api:jar:1.0.1:provided (optional) [INFO] | +- org.apache.aries.quiesce:org.apache.aries.quiesce.api:jar:1.0.0:provided (optional) [INFO] | \- org.apache.aries.proxy:org.apache.aries.proxy.api:jar:1.1.1:provided (optional) [INFO] +- org.apache.aries.blueprint:blueprint-parser:jar:1.6.1:provided (optional) [INFO] +- org.apache.ws.xmlschema:xmlschema-core:jar:2.3.0:compile [INFO] +- com.sun.mail:jakarta.mail:jar:1.6.7:test [INFO] +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.18:compile (optional) [INFO] +- org.osgi:org.osgi.core:jar:6.0.0:provided [INFO] +- org.osgi:osgi.cmpn:jar:6.0.0:provided (optional) [INFO] +- net.java.dev.msv:msv-core:jar:2013.6.1:provided (optional) [INFO] | +- net.java.dev.msv:xsdlib:jar:2013.6.1:provided (optional) [INFO] | | \- relaxngDatatype:relaxngDatatype:jar:20020414:provided (optional) [INFO] | \- com.sun.xml.bind.jaxb:isorelax:jar:20090621:provided (optional) [INFO] +- org.springframework.osgi:spring-osgi-io:jar:1.2.1:provided (optional) [INFO] +- org.springframework.osgi:spring-osgi-core:jar:1.2.1:provided (optional) [INFO] +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:compile [INFO] | \- jakarta.activation:jakarta.activation-api:jar:1.2.2:compile [INFO] \- xerces:xercesImpl:jar:2.12.2:test [INFO] \- xml-apis:xml-apis:jar:1.4.01:test
JDK 16依赖树
[INFO] org.apache.cxf:cxf-core:bundle:3.5.5 [INFO] +- junit:junit:jar:4.13.2:test [INFO] | \- org.hamcrest:hamcrest-core:jar:2.2:test [INFO] | \- org.hamcrest:hamcrest:jar:2.2:test [INFO] +- org.easymock:easymock:jar:5.0.1:test [INFO] | \- org.objenesis:objenesis:jar:3.3:test [INFO] +- jakarta.validation:jakarta.validation-api:jar:2.0.2:compile (optional) [INFO] +- org.ow2.asm:asm:jar:9.4:compile (optional) [INFO] +- xml-resolver:xml-resolver:jar:1.2:compile (optional) [INFO] +- org.glassfish.jaxb:jaxb-runtime:jar:2.3.5:compile [INFO] | +- org.glassfish.jaxb:txw2:jar:2.3.5:compile [INFO] | \- com.sun.istack:istack-commons-runtime:jar:3.0.12:compile [INFO] +- org.slf4j:slf4j-api:jar:1.7.36:compile (optional) [INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.36:test [INFO] +- org.slf4j:jcl-over-slf4j:jar:1.7.36:test [INFO] +- cglib:cglib-nodep:jar:3.3.0:provided [INFO] +- com.fasterxml.woodstox:woodstox-core:jar:6.4.0:compile [INFO] | \- org.codehaus.woodstox:stax2-api:jar:4.2.1:compile [INFO] +- org.springframework:spring-beans:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-core:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-jcl:jar:5.3.22:compile (optional) [INFO] +- org.springframework:spring-context:jar:5.3.22:compile (optional) [INFO] | \- org.springframework:spring-expression:jar:5.3.22:compile (optional) [INFO] +- org.springframework:spring-aop:jar:5.3.22:provided (optional) [INFO] +- org.apache.aries.blueprint:org.apache.aries.blueprint.core:jar:1.10.3:provided (optional) [INFO] | +- org.apache.aries.blueprint:org.apache.aries.blueprint.api:jar:1.0.1:provided (optional) [INFO] | +- org.apache.aries.quiesce:org.apache.aries.quiesce.api:jar:1.0.0:provided (optional) [INFO] | \- org.apache.aries.proxy:org.apache.aries.proxy.api:jar:1.1.1:provided (optional) [INFO] +- org.apache.aries.blueprint:blueprint-parser:jar:1.6.1:provided (optional) [INFO] +- org.apache.ws.xmlschema:xmlschema-core:jar:2.3.0:compile [INFO] +- com.sun.mail:jakarta.mail:jar:1.6.7:test [INFO] +- com.sun.xml.fastinfoset:FastInfoset:jar:1.2.18:compile (optional) [INFO] +- org.osgi:org.osgi.core:jar:6.0.0:provided [INFO] +- org.osgi:osgi.cmpn:jar:6.0.0:provided (optional) [INFO] +- net.java.dev.msv:msv-core:jar:2013.6.1:provided (optional) [INFO] | +- net.java.dev.msv:xsdlib:jar:2013.6.1:provided (optional) [INFO] | | \- relaxngDatatype:relaxngDatatype:jar:20020414:provided (optional) [INFO] | \- com.sun.xml.bind.jaxb:isorelax:jar:20090621:provided (optional) [INFO] +- org.springframework.osgi:spring-osgi-io:jar:1.2.1:provided (optional) [INFO] +- org.springframework.osgi:spring-osgi-core:jar:1.2.1:provided (optional) [INFO] +- jakarta.xml.bind:jakarta.xml.bind-api:jar:2.3.3:compile [INFO] | \- jakarta.activation:jakarta.activation-api:jar:1.2.2:compile [INFO] +- xerces:xercesImpl:jar:2.12.2:test [INFO] +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile [INFO] +- jakarta.xml.ws:jakarta.xml.ws-api:jar:2.3.3:compile [INFO] +- jakarta.jws:jakarta.jws-api:jar:2.1.0:compile [INFO] +- jakarta.xml.soap:jakarta.xml.soap-api:jar:1.4.2:compile [INFO] +- com.sun.activation:jakarta.activation:jar:1.2.2:compile [INFO] +- com.sun.xml.messaging.saaj:saaj-impl:jar:1.5.3:runtime [INFO] | \- org.jvnet.staxex:stax-ex:jar:1.8.3:runtime [INFO] +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile [INFO] \- org.jacorb:jacorb:jar:3.9:test [INFO] \- org.jacorb:jacorb-omgapi:jar:3.9:test
JDK 16新增依赖
[INFO] +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile [INFO] +- jakarta.xml.ws:jakarta.xml.ws-api:jar:2.3.3:compile [INFO] +- jakarta.jws:jakarta.jws-api:jar:2.1.0:compile [INFO] +- jakarta.xml.soap:jakarta.xml.soap-api:jar:1.4.2:compile [INFO] +- com.sun.activation:jakarta.activation:jar:1.2.2:compile [INFO] +- com.sun.xml.messaging.saaj:saaj-impl:jar:1.5.3:runtime [INFO] | \- org.jvnet.staxex:stax-ex:jar:1.8.3:runtime [INFO] +- org.apache.geronimo.specs:geronimo-jta_1.1_spec:jar:1.1.1:compile [INFO] \- org.jacorb:jacorb:jar:3.9:test [INFO] \- org.jacorb:jacorb-omgapi:jar:3.9:test
内容的提问来源于stack exchange,提问作者Raghu
相关产品推荐
相关产品推荐

