当前位置: 首页 > 知识库问答 >
问题:

Spring XD处理器模块类加载器问题:ClassNotFoundException

宦树
2023-03-14

我在Spring XD处理器模块类加载方面遇到问题,不知如何解决:

我有一个SpringXD处理器模块,在SpringXD容器中运行时找不到某些类。我在jaxb xml转换和xstream xml转换中遇到了类加载问题,因为类加载器找不到用于转换xml的类。jaxb类位于另一个jar文件中。位于同一(模块的)jar文件中的xstream类。无需任何jaxb/xstream代码即可轻松复制该问题(见下文)。

一旦下面的处理器模块代码在Spring XD容器中执行,类加载器就无法从模块的jar中找到任何类(我更改了这篇文章的包名。Foo在同一个jar文件中的同一个包中。没有外部依赖项):

// This is a spring xd processor
public class TestTransformer {

  private final Logger logger = LoggerFactory.getLogger(getClass());

  public String process(String input) {

    try {
      Class clazz = Class.forName("some.package.Foo", false, Thread.currentThread().getContextClassLoader());
      logger.info("Class: {}", clazz.toString()); // works in test
    } catch (ClassNotFoundException e) {
      // happens when deployed to spring-xd container
      logger.error(e.toString(), e);
      throw new RuntimeException(e.toString(), e);
    }
    return input;

  }
}

此代码在测试(单元测试和SpringXD集成测试)中工作,但在作为模块部署到SpringXD(singlenode)时失败。堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: some.package.Foo
at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:344)
at some.package.TestTransformer.process(TestTransformer.java:13)
... 88 more

我用SpringXD1.2.0和1.2.1验证了该行为。值得注意的是,在使用reactor流时,处理器模块运行时没有任何类加载问题。

我做错了什么,我如何解决这个问题?

共有1个答案

仇浩旷
2023-03-14

听起来Transformer类被spring集成核心类引用,该类由主XD类装入器(模块类装入器的父类)装入。因此在模块jar中看不到任何类。我创造了https://jira.spring.io/browse/XD-3472.同时,解决方法是将这些类放在一个单独的jar中,并将jar安装在xd/lib中。

 类似资料:
  • 我对Weblogic类加载器有问题。 当我尝试在WL 12.2.1.2.0上部署我的应用程序时,它失败了。在我服务器上的日志中,我看到了 该类属于xml API库。库进入我的应用程序时带有另一个依赖项(即传递依赖项)。xml API的版本是1.4.01。 之后,我在部署描述符中添加了异常: 然后是一个新的部署。所述问题与组织有关。w3c。dom。元素遍历已解决。没有关于缺少组织的任何信息。w3c。

  • 模块是存在远程服务器上的,因此需要一个特殊的加载器来加载这些已经定义好的模块。 目前,根据模块化规范,对应的模块加载器有: CMD 直接执行:coolie.js 直接执行:Sea.js 链接: 如何实现一个 CMD 模块加载器 sea.js 与 RequireJS 的异同 AMD 直接执行:RequireJS。 链接: Javascript模块化编程(一):模块的写法 Javascript模块化编

  • 模块加载和依赖管理 综合学习: 用 Browserify 创建 JavaScript 模块 [watch][$] Webpack 基本原理 [watch] browserify-handbook [read] ES6 模块 [read] 参考/文档: browserify system.js webpack 译者补充: React Webpack cookbook 详解前端模块化工具-Webpac

  • 模块加载器指的是coolie.js,在浏览器中使用。 coolie.config() 配置模块加载器的各项参数,详细文档点这里。 coolie.use([moduleId]) 执行模块加载器。其中入口模块 id 可以省略,由 html 里的data-main属性指定,指定入口模块常用于单元测试。 coolie.use('path/to/app.js'); 通常,一个模块加载的配置文件如下: co

  • 使用 ➜ coolie init -j ╔══════════════════════════════════════════════════════╗ ║ coolie@1.0.22 ║ ║ The front-end development builder. ║ ╚══════

  • 我已经在我的容器中压缩了文件,我每天都会得到一个或多个文件,当它们进来时,我想处理这些文件。我有一些问题。 > 我可以使用Databricks自动加载功能来处理zip文件吗?Autoloader是否支持zip文件? 使用Autoloader需要启用哪些设置?我有我的容器和sas令牌。 一旦zip文件被处理(解压缩,读取zip文件中的每个文件),我就不应该再次读取zip。当我使用自动加载器时,我该怎