2012-06-28 48 views
7

tôi có hệ thống phân cấp thư mục sau:Tạo file jar từ dòng lệnh

SigarTest 
src 
    SigarTest 
    .java files 
bin 
    SigarTest 
    .class files 

Ở đây, SigarTest là một tên gói. Thư mục gốc nằm trong thư mục bin của jdk. Từ đó, im chạy lệnh sau để tạo một file jar của dự án của tôi -

./jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 

nơi tools.jar, Mongo-2.7.3.jar và sigar.jar được yêu cầu và nằm trong cùng thư mục với thư mục gốc (thư mục bin của jdk). Tuy nhiên, khi chạy nó, tôi nhận được

ClassNotFoundException : SigarTest.SigarMain 

Tôi đang làm gì sai?

+0

jar cfe temp.jar SigarTest.SigarMain.class SigarTest/bin .... thử số –

+0

@AlpeshPrajapati: Không giống như những gì tôi đã làm? – Cygnus

+0

bạn chưa thêm .class sau SigarTest.SigarMain ... –

Trả lời

5

Sử dụng -Cdir option

Tạm thời thay đổi thư mục (cddir) trong quá trình thực hiện các lệnh jar khi xử lý sau inputfiles tranh cãi.

Nếu bạn thực hiện lệnh jar trong câu hỏi của bạn và danh sách các nội dung của temp.jar, bạn sẽ thấy kết quả tương tự như sau:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain SigarTest/bin/ tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/bin/ 
SigarTest/bin/SigarTest/ 
SigarTest/bin/SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 
Exception in thread "main" java.lang.NoClassDefFoundError: SigarTest/SigarMain 
Caused by: java.lang.ClassNotFoundException: SigarTest.SigarMain 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 

Lưu ý rằng có SigarTest/bin trong temp.jar không đúng. Thực thi temp.jar sẽ ném số ClassNotFoundException từ SigarMain vào gói . Bây giờ xem xét jar lệnh sau đó sử dụng -Cdir tùy chọn:

$ rm -rf temp.jar 
$ jar cfe temp.jar SigarTest.SigarMain -C SigarTest/bin/ . tools.jar sigar.jar mongo-2.7.3.jar 
$ jar tf temp.jar 
META-INF/ 
META-INF/MANIFEST.MF 
SigarTest/ 
SigarTest/SigarMain.class 
tools.jar 
sigar.jar 
mongo-2.7.3.jar 
$ java -jar temp.jar 

SigarMain là trong gói chính xác và thực hiện temp.jar không ném một ClassNotFoundException.

+0

Cảm ơn rất nhiều !! Điều đó giải quyết nó :) – Cygnus

+0

Btw, khi u do -C, thư mục có thay đổi chỉ cho các tệp theo tên thư mục hoặc tất cả các giá trị theo tên đó không? Theo đó, nó phải là quyền thứ hai? – Cygnus

+1

Tài liệu này hơi khó hiểu về điều này. Từ một số thử nghiệm, tôi thấy rằng nó chỉ là một tập tin sau đây, giải thích tại sao trong '-C SigarTest/bin /. tools.jar', 'SigarMain.class' được lấy từ' SigarTest/bin/'và' tools.jar' được lấy từ thư mục 'jar' đã được thực thi. Bạn cũng có thể chỉ định' -C' nhiều lần. – creemama

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