Sự khác biệt giữa “java -cp” và “java -jar”?


118

Sự khác biệt giữa chạy ứng dụng Java với
java -cp CLASSPATHvà là java -jar JAR_FILE_PATHgì? Một trong số chúng được ưu tiên hơn cái còn lại để chạy ứng dụng Java? Ý tôi là cách nào trong những cách này đắt hơn đối với JVM (theo cách sử dụng tài nguyên máy của họ)?

Cái nào sẽ khiến JVM sinh ra nhiều luồng hơn trong khi cố gắng chạy ứng dụng?

Câu trả lời:


97

Tôi thích phiên bản đầu tiên khởi động ứng dụng java hơn vì nó có ít cạm bẫy hơn ("chào mừng bạn đến với địa ngục classpath"). Cái thứ hai yêu cầu một tệp jar thực thi và đường dẫn classpath cho ứng dụng đó phải được xác định bên trong tệp kê khai của jar (tất cả khai báo classpath khác sẽ bị bỏ qua ...). Vì vậy, với phiên bản thứ hai, bạn sẽ phải xem xét jar, đọ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ệ từ nơi lưu trữ jar hay không ... Điều đó có thể tránh được.

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


Những gì về chủ đề? Chúng có giống nhau về số lượng luồng JVM sinh ra trong khi cố gắng chạy ứng dụng không?
Reza

1
Đúng. Cả hai phiên bản sẽ định vị phương thức chính và thực thi phương thức đó với một luồng duy nhất. Phiên bản đầu tiên chuyển tên lớp làm đối số, với phiên bản thứ hai, jvm sẽ tìm thấy nó bên trong tệp chính.
Andreas Dolk

@Andreas_D Vui lòng xem bài đăng này , tôi đoán tôi đang sử dụng -cp sai cách và tôi không biết cách sửa lỗi của mình.
fu DL

60

Với -cpđối số, bạn cung cấp (các) đường dẫn classpath đến 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 việc -jarbạ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.jarthì nó sẽ không thực sự hoạt động. Classpath cho JAR đó phải được chỉ định trong Tệp kê khai của nó, không phải như một -cpđối số.

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

PS: -cp-classpathlà từ đồng nghĩa.


Mối quan tâm của tôi là về các nguồn lực? có sự khác biệt giữa các nguồn mà họ sử dụng không?
Reza

@Hesam Nếu bạn đang hỏi về sự khác biệt hiệu suất giữa -cp-classpath, thì không, không có sự khác biệt.
Radu Murzea

1
Không! Ý tôi là sự khác biệt về hiệu suất giữa -cp (hoặc -classpath) và -jar
Reza

2
@Hesam Với -jarbạn chỉ định JAR thực thi nào bạn muốn chạy. Với việc -cpbạn chỉ định (các) đườ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. Cả hai có mục đích rất khác nhau.
Radu Murzea

@RaduMurzea, Ý bạn là nó sẽ không thực sự hoạt động khi chúng ta kết hợp chúng với nhau là gì? Ví dụjava -jar PATH -cp PATH2
Pacerier

18

Khi sử dụng, java -cpbạn phải cung cấp tên lớp chính đủ điều kiện, ví dụ:

java -cp com.mycompany.MyMain

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

Main-Class: com.mycompany.MyMain


Xin vui lòng xem bài viết này , tôi đoán tôi đang sử dụng -cp sai cách và tôi không biết cách sửa lỗi của mình.
fu DL

10

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 cho việc gỡ lỗi mã.

Định dạng thực thi khó hiểu: java -jar JarFilecó 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 các tệp jar phụ thuộc bổ sung trong MANIFEST của mình bằng cách sử dụng các lọ được phân tách bằng dấu cách 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.


Xin vui lòng xem bài viết này , tôi đoán tôi đang sử dụng -cp sai cách và tôi không biết cách sửa lỗi của mình.
fu DL

2

Giống như đã nói, -cp chỉ để thông báo cho jvm trong dòng lệnh lớp nào sẽ sử dụng cho luồng chính và nơi nó có thể tìm thấy các thư viện (định nghĩa classpath). Trong -jar nó mong đợi lớp-đường dẫn và lớp chính được xác định trong tệp kê khai tệp jar. Vì vậy, khác là để xác định mọi thứ trong dòng lệnh trong khi tìm kiếm khác bên trong tệp kê khai 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 lúc, -jar sẽ ghi đè -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ể xác định một số đường dẫn lớp trong tệp kê khai và một số đường dẫn trong dòng lệnh. Điều này đặc biệt hữu ích khi bạn phụ thuộc vào một số jar của bên thứ ba, mà bạn có thể không cung cấp cho bản dựng của mình hoặc không muốn cung cấp (mong đợi nó đã được tìm thấy trong hệ thống nơi nó đượ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ể tạo ứng dụng với phiên bản khác và thêm sự phụ thuộc thực tế của bên thứ 3 vào đường dẫn lớp trên dòng lệnh khi chạy ứng dụng trên các hệ thống khác nhau.


1

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

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.