项目

一般

简介

应用jackson类冲突

刘 亚平大约一个月 之前添加

分析:客户编写了一个自定义类加载器,加载类的逻辑是 先用SystemClassLoader尝试加载类,如果加载不到则通过上下文类加载器加载 所以客户有一个持有ObjectMapper实例的util类(MapperFactory类),该类通过自定义类加载器加载时自然是用SystemClassLoader加载不到的,所以用的是 上下文类加载器(webappclassloader),当应用的一个代理类(用自定义类加载器加载的)调用这个MapperFactory类时报错( ObjectMapper om= MapperFactory.getInstance().getObjectMapper();//暂时还不会报错 om.writeValueAsString(map);//报错加载ObjectMapper类时出现LinkageError java.lang.LinkageError: loader constraint violation: loader (instance of 客户自定义类加载器) previously initiated loading for a different type with name "com.fasterxml.jackson.databind.ObjectMapper" ) 报错是因为V10用SystemClassLoader尝试加载类是可以加载到ObjectMapper的(modules底下的),而持有ObjectMapper实例的util类的ObjectMapper类是通过上下文类加载器(webappclassloader)加载的,所以虽然ObjectMapper类都是加载同一个jar的,但是类加载器不一样会导致异常 【tomcat没有ObjectMapper所以没问题,所以SystemClassLoader尝试加载类不到的】

解决:设置不让SystemClassLoader加载到ObjectMapper 新增一个类加载器 添加jvm参数设置成系统类加载器,当加载objectMapper类时就抛出异常

具体步骤如下:

1:domain.xml新增jvm参数-Djava.system.class.loader=com.apusic.enterprise.aas.bootstrap.AASSystemClassLoader

2:替换ApusicAS/aas/module/aas.jar

3:重启

具体新增类加载代码如下:

package com.apusic.enterprise.aas.bootstrap;

public class AASSystemClassLoader extends ClassLoader {
    public AASSystemClassLoader(ClassLoader parent) {
        super(parent);
    }

    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        if (name.startsWith("com.fasterxml.jackson")) {
            throw new ClassNotFoundException("xxxxxx");
        } else {
            return super.loadClass(name, resolve);
        }
    }
}

关键字:类冲突 ,jackson,ObjectMapper,

 

aas.jar (174 KB) aas.jar