Câu hỏi Sự khác nhau giữa “java -cp” và “java -jar”?


Sự khác nhau giữa việc chạy một ứng dụng Java với
java -cp CLASSPATH và java -jar JAR_FILE_PATH? Một trong số họ có thích ứng dụng khác khi chạy một ứng dụng Java không? Tôi có nghĩa là một trong những cách này là tốn kém hơn cho JVM (theo cách sử dụng tài nguyên máy của họ)?

Mà một trong những sẽ gây ra JVM để đẻ trứng nhiều chủ đề trong khi cố gắng để chạy các ứng dụng?


76
2017-08-12 13:52


gốc




Các câu trả lời:


Tôi thích phiên bản đầu tiên để bắt đầu một ứng dụng java chỉ vì nó có ít cạm bẫy hơn ("chào mừng bạn đến với classpath địa ngục"). Cái thứ hai yêu cầu một tệp jar thực thi và đường dẫn lớp cho ứng dụng đó phải được định nghĩa bên trong biểu hiện của jar (tất cả các khai báo classpath khác sẽ được bỏ qua âm thầm ...). Vì vậy, với phiên bản thứ hai bạn sẽ phải nhìn vào bình, đọc tệp kê khai và cố gắng tìm hiểu xem các mục nhập classpath có hợp lệ không từ nơi lưu trữ jar ... Điều đó có thể tránh được.

Tôi không mong đợi bất kỳ lợi thế hiệu suất hoặc bất lợi cho một trong hai phiên bản. Nó chỉ nói cho jvm lớp nào sử dụng cho chủ đề chính và nơi nó có thể tìm thấy các thư viện.


62
2017-08-12 13:59



Điều gì về các chủ đề? Họ có giống nhau về số lượng các luồng JVM đẻ trứng trong khi cố chạy ứng dụng không? - Reza
Vâng. Cả hai phiên bản sẽ định vị phương thức chính và thực thi nó bằng một luồng đơn. Phiên bản đầu tiên chuyển tên lớp như một đối số, với phiên bản thứ hai, jvm sẽ tìm thấy nó bên trong mainfest. - Andreas_D


Với -cp đối số bạn cung cấp (các) đường dẫn lớp con cho các lớp hoặc thư viện bổ sung mà chương trình của bạn có thể yêu cầu khi được biên dịch hoặc chạy. Với -jar bạn chỉ định tệp JAR thực thi mà bạn muốn chạy.

Bạn không thể chỉ định cả hai. Nếu bạn cố gắng chạy java -cp folder/myexternallibrary.jar -jar myprogram.jar thì nó sẽ không thực sự hiệu quả. Đường dẫn lớp cho JAR đó phải được chỉ định trong Tệp kê khai của nó, không phải là một -cp tranh luận.

Bạn có thể tìm hiểu thêm về điều này đây và đây.

PS: -cp và -classpath là từ đồng nghĩa.


46
2017-08-12 13:56



Mối quan tâm của tôi là về tài nguyên? có sự khác biệt giữa các tài nguyên mà họ sử dụng không? - Reza
@ Hesam Nếu bạn hỏi về sự khác biệt về hiệu suất giữa -cp và -classpaththì không, không có sự khác biệt. - Radu Murzea
Không! Tôi có nghĩa là sự khác biệt hiệu suất giữa -cp (hoặc -classpath) và -jar - Reza
@Hesam With -jar bạn chỉ định những gì JAR thực thi mà bạn muốn chạy. Với -cp bạn chỉ định đường dẫn đến các lớp / thư viện bổ sung mà chương trình của bạn có thể yêu cầu. 2 có mục đích rất khác nhau. - Radu Murzea
+1 cho -cp và-classpath là từ đồng nghĩa. - duleshi


Khi đang sử dụng java -cp bạn được yêu cầu cung cấp tên lớp chính đầy đủ, ví dụ:

java -cp com.mycompany.MyMain

Khi đang sử dụng java -jar myjar.jar tệp jar của bạn phải cung cấp thông tin về lớp chính thông qua tệp manifest.mf chứa trong tệp jar trong thư mục META-INF:

Main-Class: com.mycompany.MyMain


10
2017-08-12 13:57





java -cp CLASSPATH là cần thiết nếu bạn muốn chỉ định tất cả mã trong classpath. Điều này rất hữu ích để gỡ lỗi mã.

Các định dạng thực thi jarred: java -jar JarFile có thể được sử dụng nếu bạn muốn khởi động ứng dụng bằng một lệnh ngắn. Bạn có thể chỉ định tệp jar phụ thuộc bổ sung trong MANIFEST của bạn bằng cách sử dụng các dấu cách tách biệt trong mục nhập Class-Path, ví dụ:

Class-Path: mysql.jar infobus.jar acme/beans.jar

Cả hai đều có thể so sánh về hiệu suất.


10
2017-08-12 13:57





Sẽ không có bất kỳ sự khác biệt về hiệu suất. Sử dụng java - cp, chúng ta có thể chỉ định các lớp cần thiết và jar trong classpath để chạy một tệp lớp java.

Nếu đó là tệp jar thực thi. Khi lệnh java -jar được sử dụng, jvm tìm thấy lớp mà nó cần chạy từ tệp /META-INF/MANIFEST.MF bên trong tệp jar.


1
2017-08-12 15:57





Như đã nói, -cp chỉ để nói jvm trong dòng lệnh mà class sử dụng cho thread chính và nơi nó có thể tìm thấy các thư viện (định nghĩa classpath). In -jar nó trông đợi class-class và class chính được định nghĩa trong tệp kê khai jar. Vì vậy, khác là để xác định những thứ trong dòng lệnh trong khi khác tìm thấy chúng bên trong biểu hiện jar. Không có sự khác biệt về hiệu suất. Bạn không thể sử dụng chúng cùng một lúc, -jar sẽ ghi đè lên -cp.

Mặc dù ngay cả khi bạn sử dụng -cp, nó vẫn sẽ kiểm tra tệp kê khai. Vì vậy, bạn có thể định nghĩa một số đường dẫn lớp trong tệp kê khai và một số trong dòng lệnh. Điều này đặc biệt hữu ích khi bạn có một sự phụ thuộc vào một số lọ bên thứ 3, mà bạn có thể không cung cấp với bản dựng của bạn hoặc không muốn cung cấp (hy vọng nó được tìm thấy đã có sẵn trong hệ thống mà nó sẽ được cài đặt chẳng hạn). Vì vậy, bạn có thể sử dụng nó để cung cấp các lọ bên ngoài. Vị trí của nó có thể khác nhau giữa các hệ thống hoặc thậm chí nó có thể có một phiên bản khác trên hệ thống khác nhau (nhưng có cùng giao diện). Bằng cách này, bạn có thể xây dựng ứng dụng với phiên bản khác và thêm sự phụ thuộc của bên thứ 3 thực tế vào lớp-đường dẫn trên dòng lệnh khi chạy nó trên các hệ thống khác nhau.


1
2018-02-03 07:21