2012-09-13 41 views
5

Tôi biết rằng chúng tôi có thể tải các lớp động bằng cách sử dụng trình nạp lớp tùy chỉnh. Nhưng ở đây vấn đề của tôi là lớp của tôi chính là phụ thuộc vào các lớp khácTải các lớp động từ jar

Nhiệm vụ của tôi là để có được đối tượng PigServer Vì vậy, tôi đã sử dụng mã sau đây để tải lớp PigServer

_pigServerClass = _classLoader.loadClass("org.apache.pig.PigServer"); 

Nhưng ở đây lớp PigServer chính nó là phụ thuộc khi có rất nhiều lớp khác.

Vì vậy, khi tôi đang cố gắng để có thể hiện của lớp PigServer sau đó nó được hiển thị lỗi sau

java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 
java.lang.ClassNotFoundException:org.apache.log4j.AppenderSkeleton 
etc.. 

bất cứ ai có thể cho làm thế nào để giải quyết này?

Trả lời

0

Cách bạn tạo ClassLoader của mình?

Bạn đã chỉ định một trình nạp lớp "cha mẹ" khác, có thể ủy quyền lớp học được không?

+0

Tôi đã tạo trình nạp lớp ..its lấy đường dẫn lớp và trả về ** _ customClassLoader = new URLClassLoader (url, PigClassLoader.class.getClassLoader()); ** –

+0

mà trình nạp lớp của tôi đang hoạt động tốt. Thats y nó không hiển thị lớp không tìm thấy ngoại lệ cho PigServer Class –

+0

Bạn có chắc chắn rằng commons-logging và log4j nằm trong classpath không? – Mirko

1

Dường như có sự hiểu lầm. Nếu bạn có tất cả các lọ được yêu cầu trong một thư mục, ví dụ: "lib", bạn có thể thiết lập trình nạp lớp như sau:

File libs = new File("lib"); 
    File[] jars = libs.listFiles(new FileFilter() { 
     public boolean accept(File pathname) { 
      return pathname.getName().toLowerCase().endsWith(".jar"); 
     } 
    }); 

    URL[] urls = new URL[jars.length]; 
    for (int i=0; i<jars.length; i++) { 
     urls[i] = jars[i].toURI().toURL(); 
    } 
    ClassLoader uc = new URLClassLoader(urls,this.getClass().getClassLoader()); 


    Class<?> pigServerClz = Class.forName("org.apache.pig.PigServer", false, uc); 
    Object pigServer = pigServerClz.newInstance(); 
    // etc... 
Các vấn đề liên quan