27 Java動態加載第三方jar包中的類



我加載的方法是:
//參數fileName是jar包的路徑,processorName 是業務類的包名+類名
public static A load(String fileName, String processorName) {
            String filePath = fileName;
              A processor = null;
  URL url;
try {
  url = new URL(filePath);
} catch (MalformedURLException e1) {
 e1.printStackTrace();
log.error("文件不存在");
return null;
}
URLClassLoader loader = new URLClassLoader(new URL[] { url });
try {
Class<?> processorClass = loader.loadClass(processorName);
processor = (A)processorClass.newInstance();
} catch (Exception e) {
log.error("創建業務類失敗");
e.printStackTrace();
return null;
}
return processor;
}
問題:用main方法來調用這個load方法是能加載jar包中業務類a的,但是如果在自己系統里面按照正常流程走的時候調用load方法的時候 卻報錯:接口類A找不到, 但是接口類A是明明定義在系統內部的,(兩次調用load方法的入參都是一樣的)

解決方法:

parentClassLoader,即Thread.currentThread().getContextClassLoader(),就能從當前程序中查找接口類A

 

 

package com.main.java;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;

/**
 */
public class TestClassLoad2 {
    private static Logger LOGGER = LoggerFactory.getLogger(TestClassLoad2.class);
    public static void main(String[] args) {
        args=new String[]{"file://F:/bin/lib/test.jar","com.main.java.TestProcess"};
        LOGGER.info("start");
        load(args[0],args[1]);
    }
    public static Process load(String fileName, String processorName) {
        String filePath = fileName;
        Process processor = null;
        URL url;
        try {
            url = new URL(filePath);
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
            LOGGER.info("文件不存在");
            return null;
        }
        URLClassLoader loader = new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader());
        //URLClassLoader loader = new URLClassLoader(new URL[] { url });
        try {
            Class<?> processorClass = loader.loadClass(processorName);
            processor = (Process)processorClass.newInstance();
            processor.display();
        } catch (Exception e) {
            LOGGER.info("創建業務類失敗");
            e.printStackTrace();
            return null;
        }
        return processor;
    }
}

 

package com.main.java;

public interface Process {
    void display();
}

另一個jar包的類

package com.main.java;
public class TestProcess implements Process {
    @Override
    public void display() {
        System.out.println("test testProcess");
    }
}

注意事項: 兩個jar包的Process接口,包路徑必須一致

file://F:/bin/lib/ 也可以

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM