Spring Boot 3 EAR部署WebSphere Liberty启动类找不到错误求助
环境与配置
已将Spring Boot应用升级至3.x版本,切换到Java 17,WebSphere Liberty服务器已安装Java 17补丁,server.xml中启用的特性如下:
<featureManager> <feature>servlet-6.0</feature> <feature>ssl-1.0</feature> <feature>ldapRegistry-3.0</feature> <feature>zosLocalAdapters-1.0</feature> <feature>zosTransaction-1.0</feature> <feature>jdbc-4.3</feature> <feature>jndi-1.0</feature> <feature>springBoot-3.0</feature> <feature>monitor-1.0</feature> <feature>mpMetrics-5.0</feature> <feature>enterpriseBeans-4.0</feature> </featureManager>
部署异常
部署Spring Boot EAR包时抛出如下ClassNotFoundException:
Caused by: java.lang.ClassNotFoundException: CWWKL0084W: The javax.transaction.Synchronization class could not be loaded. Try enabling the jdbc-4.0 feature or a newer version of the feature in the server.xml file. at com.ibm.ws.classloading.internal.util.FeatureSuggestion.getExceptionWithSuggestion(FeatureSuggestion.java:118) ~[na:na] at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:606) ~[na:na] at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:553) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1095) ~[na:na] ... 84 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.transaction.Synchronization at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:742) ~[na:na] at com.ibm.ws.classloading.internal.AppClassLoader.findClass(AppClassLoader.java:327) ~[na:na] at com.ibm.ws.classloading.internal.AppClassLoader.findOrDelegateLoadClass(AppClassLoader.java:714) ~[na:na] at com.ibm.ws.classloading.internal.AppClassLoader.loadClass(AppClassLoader.java:586) ~[na:na] ... 86 common frames omitted
应用Gradle依赖
dependencies { implementation project(":sofa-domain") implementation project(":sofa-business-api") implementation platform("org.springframework.boot:spring-boot-dependencies:$springBootVersion") implementation("org.springframework.boot:spring-boot-starter-log4j2:$springBootVersion") { exclude group: 'org.apache.logging.log4j', module: 'log4j-slf4j2-impl' } implementation("org.springframework.boot:spring-boot-starter-web") { exclude group: 'org.apache.tomcat', module: "spring-boot-starter-tomcat" } implementation('com.fasterxml.jackson.core:jackson-databind:2.16.1') implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("jakarta.xml.bind:jakarta.xml.bind-api:4.0.1") providedCompile("jakarta.ejb:jakarta.ejb-api:4.0.1") providedCompile("jakarta.resource:jakarta.resource-api:2.1.0") implementation("jakarta.validation:jakarta.validation-api:$validationApiVersion") implementation("io.springfox:springfox-swagger2:$springfoxVersion") implementation("io.springfox:springfox-swagger-ui:$springfoxVersion") implementation("io.springfox:springfox-bean-validators:$springfoxVersion") implementation('com.ibm.websphere.appserver.features:zosLocalAdapters-1.0:24.0.0.1') implementation('com.ibm.websphere.appserver.api:com.ibm.websphere.appserver.api.zosLocalAdapters.jakarta:1.0.86'){ exclude group: 'javax.servlet', module:'javax.servlet-api' exclude group: 'io.openliberty.features', module: 'io.openliberty.servlet.api' } implementation('com.ibm.websphere.appserver.features:zosSecurity-1.0:24.0.0.1'){ exclude group: 'io.openliberty.features', module: 'com.ibm.websphere.appserver.eeCompatible' exclude group: 'io.openliberty.features', module: 'io.openliberty.servlet.api' } implementation("com.google.guava:guava:$guavaVersion") implementation 'org.glassfish.expressly:expressly:5.0.0' implementation group: 'javax.transaction', name: 'jta', version: '1.1' compileOnly("org.projectlombok:lombok:$lombokVersion") annotationProcessor("org.projectlombok:lombok:$lombokVersion") testCompileOnly("org.projectlombok:lombok:$lombokVersion") testAnnotationProcessor("org.projectlombok:lombok:$lombokVersion") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.spockframework:spock-core:$spockVersion") testImplementation("org.spockframework:spock-spring:$spockVersion") implementation("org.spockframework:spock-junit4:$spockVersion") testRuntimeOnly 'org.junit.vintage:junit-vintage-engine' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' providedRuntime("com.ibm.db2.jcc:db2jcc:db2jcc4") runtimeOnly ("org.postgresql:postgresql:42.7.0") implementation("org.hibernate.validator:hibernate-validator:$validationImplVersion") implementation 'org.zalando:problem-spring-web-starter:0.29.1' }
已尝试但无效的方案
- 在Gradle中添加
javax.transaction:jta:1.1依赖 - 在
server.xml中添加persistence-1.0特性
解决方案
1. 移除旧的Java EE事务依赖
删除Gradle依赖中的implementation group: 'javax.transaction', name: 'jta', version: '1.1'。Spring Boot 3基于Jakarta EE 10,使用jakarta.transaction.*包路径,旧的javax.transaction依赖会与Liberty提供的Jakarta事务API产生类路径冲突,且Liberty的事务特性会自动提供所需的API,无需手动添加。
2. 添加Jakarta事务特性到server.xml
在featureManager中添加transaction-2.0特性(对应Jakarta EE 10的事务规范),补充现有配置:
<feature>transaction-2.0</feature>
该特性会提供jakarta.transaction.Synchronization类,而旧的javax.transaction.Synchronization在Jakarta EE 10环境中已被废弃,Liberty不会默认提供,必须启用正确的Jakarta事务特性。
3. 确认特性兼容性
zosTransaction-1.0用于z/OS平台的事务集成,依赖基础的transaction-2.0特性提供的API,WebSphere Liberty 24.0.0.1版本中两者完全兼容,无需担心冲突。
4. 清理遗留的javax依赖
检查所有依赖,确保没有其他javax.*开头的API依赖混入(除了必要的遗留库),保证所有API依赖都使用jakarta.*包路径的版本,与Jakarta EE 10规范一致。
内容的提问来源于stack exchange,提问作者SamD

