2012-09-24 34 views
6

Tôi có thể tạo tệp jar thực thi với Eclipse. Giả sử nó được gọi là ast.jar và lớp Chính là ASTExplorer. Tôi có thể xác minh rằng thao tác này hoạt động với java -jar ast.jar.Phép thuật đằng sau nhật thực đã tạo ra tệp jar thực thi

Sau đó, tôi giải nén tệp jar trong một thư mục riêng và xác minh rằng ASTExplorer nằm trong thư mục astexplorer. Nhưng khi tôi thực hiện lệnh này java -cp . astexplorer.ASTExplorer Tôi nhận được lỗi này.

java -cp . astexplorer/ASTExplorer 
Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/swt/widgets/Composite 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:615) 

Điều này không có thư mục org/eclipse/swt trong tệp jar.

Directory screenshot

Phép thuật đằng sau tệp jar thực thi là gì? Tại sao nó không chạy khi giải nén?

+0

Bạn nên thử tạo JAR của bạn với kiến, không có ma thuật đen nhật thực. –

+0

Classpath của bạn là gì khi bạn chạy 'java -jar ast.jar'. Khi bạn giải nén tệp jar, đường dẫn lớp của bạn là '.'. Tôi đoán rằng có một biến môi trường CLASSPATH được đặt thành thứ gì đó cho phép 'java -jar ast.jar' hoạt động. – km1

Trả lời

2

Khi Eclipse gói một jar có thể chạy được, nó bao gồm các phụ thuộc như các tệp jar lồng nhau và cũng bao gồm trình nạp lớp đặc biệt hiểu cách tìm các lớp trong các lồng lồng nhau. Nó chỉ hoạt động với các lọ lồng nhau và khi bạn trích xuất mọi thứ bạn ngăn nó hoạt động.

Tôi đã nhìn vào một jar Runnable Eclipse sản xuất, và đây là những gì tôi nghĩ rằng bạn sẽ cần phải làm:

  1. Giải nén tất cả mọi thứ vào một thư mục. Các lọ phụ thuộc được chiết xuất vào thư mục cấp cao nhất
  2. Xóa org/eclipse/JDT/thư mục nội bộ
  3. Chạy lớp chính của bạn từ thư mục cấp cao nhất với

    java -cp .;dep-jar;dep-jar;... your.main.class

Tôi đã thử điều này với một cái lọ runnable tôi xảy ra đã nằm xung quanh và nó hoạt động. Bước 2 là không cần thiết.

+0

Tôi có thể làm cho nó thực hiện bằng cách sử dụng -cp.: TẤT CẢ CÁC LỌC JAR TỪ ECLIPSE main.class. Tôi nghĩ rằng có vẻ như không có phép thuật lớn đằng sau nhật thực tạo ra tệp jar thực thi ngoài việc gói nó lên và tự động tham chiếu đến tệp jar một cách tự động – prosseek

+1

Cộng thay thế trình nạp lớp "jarinjar" trong tệp mainfest. –

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