仅当在部署在 Azure 上的 JDK 17 和 Spring Boot 上使用 JobRunr 在开发环境中运行计划任务时,我才会遇到 JAXBException。当我通过控制器或本地调用相同的方法时,不会出现此问题。
**问题: ** 在开发环境中,在 JobRunr cron 作业执行期间,我面临:
javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
**我尝试过的: ** 确认 pom.xml 中的 JAXB 依赖项(使用 org.glassfish.jaxb:jaxb-runtime:4.0.5)。
在控制器和 cron 作业执行期间打印类路径和类加载器详细信息。结果是相同的:
尽管使用相同的代码创建 JAXBContext 实例,仍然会出现此错误:
try {
JAXBContext jc = JAXBContext.newInstance(MrwServiceImpl.class);
LOG.error("JAXBContext: {}", jc);
} catch (JAXBException e) {
LOG.error("Error al crear JAXBContext", e);
}
在本地或从控制器执行时:
2024-03-16T12:09:36.688Z ERROR 128 --- [http-nio-80-exec-5] e.a.s.api.service.impl.TestServiceImpl : JAXBContext: jar:file:/home/site/wwwroot/app.jar!/BOOT-INF/lib/jaxb-impl-4.0.2.jar!/org/glassfish/jaxb/runtime/v2/runtime/JAXBContextImpl.class Build-Id: 4.0.2 - d104f19
Classes known to this context:
[B
boolean
byte
char
double
es.miapp.shippingservices.api.service.impl.TestServiceImpl
float
int
jakarta.activation.DataHandler
jakarta.xml.bind.JAXBElement
java.awt.Image
java.io.File
java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.Long
java.lang.Object
java.lang.Short
java.lang.String
java.lang.Void
java.math.BigDecimal
java.math.BigInteger
java.net.URI
java.net.URL
java.util.Calendar
java.util.Date
java.util.GregorianCalendar
java.util.UUID
javax.xml.datatype.Duration
javax.xml.datatype.XMLGregorianCalendar
javax.xml.namespace.QName
javax.xml.transform.Source
long
org.glassfish.jaxb.runtime.api.CompositeStructure
short
void
ClassPath: /home/site/wwwroot/app.jar:/usr/local/appservice/lib/azure.appservice.jar
Class Loader: org.springframework.boot.loader.LaunchedURLClassLoader
检查并记录环境变量和系统属性,但没有发现显着差异。
添加了有关 JAXBContext 创建和其他 JAXB 操作的显式日志记录。
检查类加载和 Spring 配置中是否存在潜在冲突。
在本地环境中针对开发设置成功运行。
**问题: ** 在生产 Azure 环境中执行 JobRunr cron 期间,如何确保类路径中提供正确的 JAXB 实现?与本地运行或控制器调用的方法相比,Azure 或 JobRunr 中是否存在可能以不同方式影响类加载的特定配置或环境条件?
任何有关解决这种令人困惑的行为的见解将不胜感激!
如果你有
javax.xml.bind.JAXBException
异常并且类路径中有 jaxb-ri 4.x,那么你已经混合了 jaxb-api 和 jaxb-ri。
我很确定您的应用程序使用 jaxb-api 2.x,但运行时是 4.x,这是不兼容的。
根据 SpringBoot 版本,如果针对 SpringBoot 2.x,则应将 jaxb-ri 降级到 2.x (2.3.9);如果针对 SpringBoot 3.x,则应将 jaxb-api 升级到 4.x (4.0.2)