问题
如果 ArcObjects SDK for Java Server Object Extension (SOE) 或 Server Object Interceptor (SOI) 引用了 JDK 8 中存在但在更高版本的 JDK 中被移除的某些 Java API,例如“java.xml.ws”、“java.corba”或“java.transaction”模块中的类,那么在访问触发引用这些模块中的类的 SOE 或 SOI 代码时可能导致出现错误消息。 服务器日志中出现以下严重级别的消息:
级别 | 时间 | 消息 | 源 |
---|---|---|---|
严重 | 2021 年 7 月 1 日 10:03:03 AM | 服务“USA.MapServer”的实例处理请求失败。 AutomationException: sun/misc/BASE64Encoder | USA.MapServer |
严重 | 2021 年 7 月 1 日 10:03:00 AM | 服务“USA.MapServer”的实例处理请求失败。 AutomationException: org/omg/CORBA/StringHolder | USA.MapServer |
严重 | 2021 年 7 月 1 日 10:02:57 AM | 服务“USA.MapServer”的实例处理请求失败。 AutomationException: javax/xml/ws/Service$Mode | USA.MapServer |
SOE 或 SOI 工程可以构建成功,无编译错误。 仅当 SOE 或 SOI 部署到 ArcGIS Server 10.7 或更高版本时,才会在运行时看到此问题。
自 ArcGIS Server 10.7 起,支持基于 ArcMap 的服务的服务运行时从 Java 8 升级到 Java 11,尽管仍需要使用 JDK 8 构建 ArcObjects Java SOE 和 SOI。 因此,在 ArcGIS Server 10.7 或更高版本中,从 JDK 11 中移除但仍在 ArcObjects SOE 或 SOI 中引用的 Java 类不会由运行在 Java 11 上的服务运行时自动加载,如 ArcGIS Server 的先前版本一样。
要查看在 JDK 11 中移除的 Java 模块列表,请参阅移除 Java EE 和 CORBA 模块
如果您曾经在 ArcGIS Server 10.7 的先前版本中使用 ArcObjects Java SOE 或 SOI,但是却在 ArcGIS Server 更高版本中遇到类似问题,请首先确认日志消息中报告的 Java 类是否来自已从 JDK 11 中移除的 Java 模块。 确认这一点后,可选择以下两个选项之一继续执行操作:
选项 1:添加从 JDK 11 中移除的 Java 模块的 JAR 文件作为您在 SOE 或 SOI 工程中的依赖项,并导出具有依赖项的 SOE 或 SOI
有关在 SOE 或 SOI 中打包第三方依赖项的分步说明,请参阅如何导出具有依赖项的 Java SOE。 通过这种方式,服务运行时可以从在 SOE 或 SOI 中打包的 JAR 文件加载 Java 类,这应该可以解决此问题。
选项 2:迁移 ArcObjects SOE 或 SOI 以使用 Enterprise SDK 进行编译
由于 Enterprise SDK 支持使用 JDK 11 为基于 ArcGIS Pro 的服务构建 Java SOE 和 SOI,因此您还可以迁移 ArcObjects SOE 或 SOI 以使用 Enterprise SDK 进行构建。 要使用从 JDK 11 中移除的 Java 模块中的类,您必须将这些模块添加为 SOE 或 SOI 工程中的第三方依赖项。 否则,您的 SOE 或 SOI 工程将编译失败,对于那些在 JDK 11 中不存在的类,Java 编译器会提示错误信息,除非添加相关依赖项。 这有助于在编译时而非运行时检测此 Java 类加载问题。
文章 ID: 000026040
获取来自 ArcGIS 专家的帮助
下载 Esri 支持应用程序