代码之家  ›  专栏  ›  技术社区  ›  quarks

修复自定义类加载器上的NoClassDefFoundError

  •  2
  • quarks  · 技术社区  · 6 年前
    public class JarByteClassloader extends ClassLoader {
      public JarInputStream jis;
      public JarByteClassloader(JarInputStream jarInputStream) throws IOException {
        super(Thread.currentThread().getContextClassLoader());
        this.jis = jarInputStream;
      }
    }
    

    public void executeMainClass(CustomCodeRequest request) {
        String classToLoad = null;
        String methodName = request.getMethodName();
        final ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader();
        try{
          Pair<String,JarInputStream> pair = extractMainClassManifest(jar);
          classToLoad = pair.getFirst();
          JarByteClassloader loader = new JarByteClassloader(pair.getSecond());
          Class c = loader.loadClass(classToLoad);
          Thread.currentThread().setContextClassLoader(loader);
          JarEntryObject jarEntry = (JarEntryObject) c.newInstance();
          List<JarCodeMethod> methods = jarEntry.methods();
          for (JarCodeMethod cc : methods) {
            // This code throws NoClassDefFoundError
            String ccMethodName = cc.getMethodName();
            if (methodName.equals(ccMethodName)) {
    
            }
          }
        } catch (Exception e) {
          e.printStackTrace();
        } finally{
          Thread.currentThread().setContextClassLoader(originalClassLoader);
        }
      }
    

    抛出:

    Caused by: java.lang.NoClassDefFoundError: com/apex/backends/methods/ProcessBranch
        at com.apex.backends.MyJarEntryObject.methods(MyJarEntryObject.java:22)
    

    这场灾难的根本原因是什么 NoClassDefFoundError

    罐子在哪里就像

    公共类MyJarEntryObject扩展了JarEntryObject{@Override public List方法(){List 方法=新建LinkedList();方法。添加(新建) ProcessMethod());返回方法;}}

    0 回复  |  直到 6 年前