使用部署在 Azure 应用服务中的 JDK 17 Spring Boot 应用程序对 JobRunr 计划任务中的 JAXBException 进行故障排除

问题描述 投票:0回答:1

仅当在部署在 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 中是否存在可能以不同方式影响类加载的特定配置或环境条件?

任何有关解决这种令人困惑的行为的见解将不胜感激!

spring-boot azure-web-app-service jaxb jobrunr
1个回答
0
投票

如果你有

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)

© www.soinside.com 2019 - 2024. All rights reserved.