2012-04-30 62 views
11

Ok Tôi biết câu hỏi này đã được hỏi rất nhiều lần trước đây, nhưng tôi đã googled nó và xem xét các ví dụ và xem các câu hỏi trên SO trong tháng qua, và tôi nghiêm túc không thể làm được điều này. Tôi nghĩ rằng vấn đề là tôi muốn có thể chạy chương trình từ cả Eclipse và dòng lệnh. Tôi cũng đang sử dụng OSX và tôi nghĩ rằng rất nhiều ví dụ tôi đang đọc là dành cho Windows/Linux.Thêm jar vào classpath khi chạy từ dòng lệnh

Nếu tôi có một chương trình đơn giản được biên soạn trong Eclipse mà tôi muốn chạy từ dòng lệnh tôi làm điều này:

java -cp bin MyProgram 

Tôi đã một chương trình khác tôi biên dịch và chạy trong Eclipse, và điều này tham chiếu JDBC MySQL trình kết nối (mysql-connector-java-5.1.19-bin.jar) được lưu trữ trong cùng một thư mục. Điều này làm việc tốt từ Eclipse, nhưng tôi không thể chạy nó từ dòng lệnh.

Tôi đã thử tất cả các kết hợp của sự vật ...

java -classpath "bin;mysql-connector-java-5.1.19-bin.jar" MyProgram 
java -cp bin\;mysql-connector-java-5.1.19-bin.jar MyProgram 

và nhận được tất cả các loại lỗi lớp không tìm thấy ...

Exception in thread "main" java.lang.NoClassDefFoundError: MyProgram 
Caused by: java.lang.ClassNotFoundException: MyProgram 
    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) 
+0

Hi Matt, nếu tôi không nhầm tôi nghĩ classpath là để khai báo đường dẫn đến những lớp học chính bạn muốn thực hiện. Vì vậy, trong trường hợp này nếu lớp của bạn nằm trong thư mục bin tôi sẽ thử: java MyProgram hoặc java -cp myprogrampath MyProgram –

+1

@FedericoGiust Không cụ thể; classpath chỉ định nghĩa một kho lưu trữ hoặc một đường dẫn đến một tập các lớp. Đường dẫn lớp có thể có hoặc không bao gồm lớp runnable (thường dẫn đến lỗi ngoại lệ hoặc lỗi java.exe). Classpath có thể bao gồm các thư mục và lưu trữ không có các lớp runnable. – Qix

+0

có thể trùng lặp của [dòng lệnh Java có bên ngoài .jar] (http://stackoverflow.com/questions/6069702/java-command-line-with-external-jar) –

Trả lời

13

Sự cố của bạn là dấu tách phút bạn đang sử dụng. Dấu phân tách ; dành cho cửa sổ. Trên các hệ thống Unix bạn nên sử dụng : thay vì:

java -classpath "bin: mysql-connector-java-5.1.19-bin.jar" MyProgram

0

bạn không thiết lập lớp học chính của bạn trong classpaht , hãy thử thêm ./ vào -p

+0

Tôi nghi ngờ rằng thư mục hiện tại chứa lớp chính của nó, Tôi tin rằng 'bin' có chứa những thứ đó. –

+0

'MyProgram' phải được đặt thành classpath, bạn cũng cần thêm tên pachage nếu bạn đặt' MyProgram' vào gói. – user1335794

+0

Đừng lo lắng, tôi biết tất cả về classpath và tên đầy đủ. Tôi chỉ nói rằng việc thêm thư mục hiện hành vào classpath là vô dụng nếu các lớp của anh ta nằm trong thư mục bin. –

5

Sử dụng dấu ':' để tách các mục nhập của bạn trên hệ thống Unix:

java -classpath "bin:mysql-connector-java-5.1.19-bin.jar" MyProgram 
java -cp bin:mysql-connector-java-5.1.19-bin.jar MyProgram 

Eclipse tự động chuyển đổi nó.

+0

Bất kỳ lý do nào để thoát khỏi đại tràng? –

+0

không, chỉ cần cắt/dán không tốt ... Tôi đã sửa nó – mprivat

-2

Tôi rất muốn đề nghị bạn thử --jar hoặc -jar . Tôi không thể nhớ nó là gì, nhưng những thứ đó sẽ giải quyết bạn. Ngoài ra, nếu bạn có các công cụ dev từ táo, họ có một máy đóng gói jar.

+1

Đó là -jar, nhưng các lớp học của anh ta không hề sợ hãi. Hãy quên đi các công cụ của Apple dev mà họ đang có từ thế kỷ trước. Eclipse, NetBEans và IntelliJ là những năm ánh sáng phía trước. –

+0

@GuillamePolet Agrred, nhưng tôi chỉ đề cập họ làm với họ đến với một tiện ích để sản xuất ứng dụng từ lọ –

1

Xem:

String pathSeparator = System.getProperty("path.separator"); 
Các vấn đề liên quan