2011-12-06 31 views
6

Tôi có tệp jar đề cập đến lớp chính trong tệp kê khai. Khi tôi cố gắng thực hiện bình bằng cách sử dụng lệnh sau đâyTùy chọn java -jar có thay đổi tùy chọn đường dẫn

java -cp .;./* com.foo.MainClass 

Mã thực thi và hoạt động.

Khi tôi cố gắng thực hiện jar bằng cách sử dụng lệnh sau

java -cp .;./* -jar myjar.jar 

tôi nhận lớp không tìm thấy execptions đối với một số lọ, đều trong cùng thư mục giống như MyJar.jar. Tôi hy vọng rằng tùy chọn -cp sẽ bao gồm các jars đó trong đường dẫn lớp. Tôi đã sửa đổi mã của mình để in thuộc tính java.class.path. Trong trường hợp đầu tiên, nó liệt kê tất cả các lọ trong thư mục hiện tại, trong trường hợp thứ hai, nó chỉ liệt kê myjar.jar

Tôi cũng sửa đổi tệp kê khai để thêm phần tử Lớp-Path vào tất cả các lọ. Sau đó, lệnh thứ hai hoạt động. Nhưng trong mã của tôi tôi đang cố gắng để tải một lớp học kinh tế có tên được cung cấp tại dấu nhắc lệnh, vì vậy tôi muốn đường dẫn lớp chứa tất cả các lọ trong một thư mục. Làm cách nào để lệnh thứ hai hoạt động trong trường hợp này?

+0

Hãy xem [OneJar] (http://one-jar.sourceforge.net/). Điều đó sẽ giải quyết vấn đề CP của bạn. – flash

+0

@flash: Có thể là không. Anh ta nói anh ta không biết đường dẫn lớp bổ sung vào thời gian biên dịch (nếu không anh ta chỉ có thể thêm nó vào tệp kê khai). – Thilo

+1

Có vẻ như bạn phải sử dụng trình nạp lớp của riêng mình (điều đó sẽ thêm lại mọi thứ theo môi trường của bạn). – Thilo

Trả lời

6

Từ this,

Một JAR thực thi phải tham khảo tất cả các lọ phụ thuộc khác, nó đòi hỏi qua tiêu đề Class-Path of the file manifest. Biến môi trường CLASSPATH và bất kỳ đường dẫn lớp nào được chỉ định trên dòng lệnh bị bỏ qua bởi JVM nếu tùy chọn -jar được sử dụng.

+0

Cảm ơn! Điều này có nghĩa rằng nếu tôi muốn tải một lớp học kinh tế có tệp jar có mặt ở cùng một vị trí với tệp jar của tôi (và không được đề cập trong tệp kê khai của tôi), tôi cần sử dụng URLClassLoader để tải jar đó một cách rõ ràng? – mihirg

+0

Vâng, bạn có thể thêm một cái gì đó như 'plugins/*' vào classpath manifest của bạn. Thư mục cho các tệp jar sẽ được sửa, nhưng tất cả các lọ trong đó sẽ được chọn. – Thilo

+0

Hoặc có thể không: "Tuy nhiên, ký tự đại diện đường dẫn lớp không được vinh danh trong tiêu đề tệp kê khai lớp-Đường dẫn." :-( – Thilo

0

Bạn sẽ cần trình nạp lớp của riêng mình để giải quyết vấn đề này. -jar chỉ tôn trọng thông tin trong Tệp kê khai và ký tự đại diện không được phép ở đó.

Bạn có thể tìm thấy những ví dụ về một lớp nạp hữu ích: http://www.exampledepot.com/egs/java.lang/ReloadClass.html

0

Here là một cuộc thảo luận tốt về vấn đề này.

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