2012-11-23 45 views
5

Trong ứng dụng Java, tôi đang cố tạo cá thể của lớp Class1 bằng cách sử dụng phương thức newInstance() trên lớp. Class1 thuộc về dự án của tôi, nhưng nó cũng cần Class2 từ dự án khác và nằm ở trong một bình bên ngoài mà tôi đã thêm vào dự án và đường dẫn xây dựng trong Eclipse. Eclipse dường như tìm Class2 vì nó biên dịch dự án mà không có bất kỳ vấn đề gì, nhưng khi tôi cố gắng để có được thể hiện của Class1 nó ném một ClassNotFoundException về Class2.ClassNotFoundException trong thời gian chạy nhưng ứng dụng biên dịch

Đây là cách Class1 trông giống như:

import other.package.Class2; 

public class Class1 implements Class1Interface{ 
    //there's no explicit constructor 

    @Override 
    public void method1(String param){ 
     System.out.println("Loading....."); 
    } 

    @Override 
    public void notifyChanges(String param) throws Exception{ 
     Class2 class2 = Class2.getInstance(); //here it's used the Class2 from another jar 
     ... 
    } 
} 

và đây là cách tôi cố gắng để có được những thể hiện của nó:

String myParam = "blabla"; 
Class1Interface interf = "my.package.Class1"; 
try { 
    interf = (Class1Interface) Class.forName(interfazws).newInstance(); 
    interf.method1(myParam); 
} catch (InstantiationException e) { 
    handle(e); 
} catch (IllegalAccessException e) { 
    handle(e); 
} catch (ClassNotFoundException e) { 
    handle(e); 
} 

Và khi tôi thực hiện mà tôi nhận được:

Caused by: org.springframework.scheduling.quartz.JobMethodInvocationFailedException: Invocation of method 'execute' on target class [class my.package.myJobJob] failed; nested exception is java.lang.NoClassDefFoundError: other/package/Class2    
... 
Caused by: java.lang.NoClassDefFoundError: other/package/Class2 
... 
Caused by: java.lang.ClassNotFoundException: other.package.Class2 

Một điều cần thêm về cấu hình dự án của tôi là trong thư mục WEB-INF, tôi có một thư mục có tên là libs với một số ja rs và tôi tạo ra một thư mục lib gọi là libs_other_company và tôi đã đặt ở đó cái lọ nơi Class2 đang ở. Nếu tôi đi đến đường dẫn xây dựng java, tôi có thể thấy jar được thêm vào trong thẻ thư viện.

Tôi đang chạy ứng dụng trong máy chủ Tomcat trực tiếp từ Eclipse (Tôi không sử dụng bất kỳ thứ gì như Ant hoặc Maven).

Làm cách nào để có thể tìm thấy lớp tại thời gian biên dịch nhưng không tìm thấy ở thời gian chạy? Bất kỳ ý tưởng để làm cho nó hoạt động?

Cảm ơn.

+0

Có vẻ như nó đã được giải quyết ở đây. Chưa kiểm tra. –

Trả lời

4

Bạn nhầm lẫn hai thứ riêng biệt, biên dịch độ phân giải đường dẫn lớp thời gian và chạy truy cập đường dẫn lớp thời gian.

  1. Khi bạn biên dịch ứng dụng của bạn, bạn cần phải có các lớp học mà ứng dụng của bạn sử dụng/đề cập đến trong môi trường phát triển của bạn biên dịch đường dẫn lớp; nếu bạn không (làm điều đó) thì một lỗi thời gian biên dịch sẽ xảy ra.

  2. Khi bạn chạy ứng dụng đã biên dịch của bạn, bạn cần phải có tất cả các lớp mà ứng dụng của bạn sử dụng/tham chiếu trong đường dẫn lớp JVM hoặc được bao gồm trong gói ứng dụng của bạn; nếu bạn không (làm điều đó) thì một lỗi thời gian chạy sẽ xảy ra.

Bạn trải nghiệm thứ hai.

+2

Tôi biết rằng đây là vấn đề. Tôi không hiểu tại sao nhật thực lại không lấy bình vào môi trường thời gian chạy. – Javi

+1

Bởi vì nó không làm điều đó theo mặc định, bạn phải "cho biết" nó lớp/jar để bao gồm, nếu không mỗi ứng dụng sẽ phải chứa (gần) tất cả các lớp. Chỉ ** bạn ** sẽ biết loại môi trường bạn dự định chạy ứng dụng của bạn. Vì lý do này, tôi thích sử dụng kiến ​​xây dựng các tệp để đóng gói các ứng dụng. –

+0

vì vậy có cách nào để cấu hình trong Eclipse hay tôi phải xây dựng một kịch bản lệnh Ant cho điều đó? – Javi

Các vấn đề liên quan