解决使用自定义类加载器加载类时的正确依赖关系

时间:2019-08-25 02:47:05

标签: java

因此,我有一个通用的后端服务器,该服务器将着色的jar加载到内存中,然后通过自定义的Classloader加载。

例如

MyClass class = c.newInstance();

它可以正常工作,直到有阴影的Jar依赖项与服务器类冲突为止。

例如

服务器包含(带有自定义类加载器):

com.fasterxml.jackson.jackson-databind:2.6.0

装有阴影的罐子中

com.fasterxml.jackson.jackson-databind:2.9.9

当类中的方法需要所述库时,例如class.doSomeThing();会引发错误Caused by java.lang.NoSuchFieldError:,因为已加载的jackson-databind is 2.6.0而非2.9.9

这里的问题是,当从有阴影的jar加载类时,是否有办法确保已使用阴影的依赖项?

1 个答案:

答案 0 :(得分:0)

  

这里的问题是,当从有阴影的jar加载类时,是否有办法确保已使用阴影的依赖项?

如果使用默认的Class loader,则解析顺序将作为classpath的顺序。在您的代码中,您可以使用

System.out.println(System.getProperty("system.class.path").replaceAll(":", "\n"));

并检查类路径。通常,此类运行时环境(例如apache spark)具有这样的features,以允许您在类路径之前添加。您可以在运行时服务器环境中检查该功能。