"java -cp"와 "java -jar"의 차이점은 무엇입니까?


118

와 자바 응용 프로그램을 실행 사이의 차이 무엇
java -cp CLASSPATHjava -jar JAR_FILE_PATH? 둘 중 하나가 Java 응용 프로그램을 실행하기 위해 다른 것보다 선호됩니까? 이 방법 중 어느 것이 JVM에 더 비쌉니까 (머신 리소스 사용량에 따라)?

애플리케이션을 실행하는 동안 JVM이 더 많은 스레드를 생성하게 만드는 것은 무엇입니까?

답변:


97

나는 함정이 적기 때문에 자바 애플리케이션을 시작하는 첫 번째 버전을 선호한다 ( "classpath hell에 오신 것을 환영합니다"). 두 번째 파일에는 실행 가능한 jar 파일이 필요하며 해당 애플리케이션의 클래스 경로는 jar의 매니페스트 내에 정의되어야합니다 (다른 모든 클래스 경로 선언은 자동으로 무시됩니다 ...). 따라서 두 번째 버전에서는 jar를 살펴보고 매니페스트를 읽고 jar가 저장된 위치에서 클래스 경로 항목이 유효한지 확인해야합니다. 피할 수 있습니다.

두 버전 모두 성능 이점이나 단점을 기대하지 않습니다. 메인 스레드에 사용할 클래스와 라이브러리를 찾을 수있는 위치를 jvm에게 알려주는 것입니다.


스레드는 어떻습니까? 응용 프로그램을 실행하는 동안 JVM이 생성되는 스레드 수 측면에서 동일합니까?
Reza

1
예. 두 버전 모두 기본 메서드를 찾고 단일 스레드로 실행합니다. 첫 번째 버전은 클래스 이름을 인수로 전달하고 두 번째 버전을 사용하면 jvm이 mainfest 내에서이를 찾습니다.
Andreas Dolk 2012 년

@Andreas_D이 게시물을 살펴 보시겠습니까? -cp를 잘못된 방식으로 사용하고 있으며 내 실수를 수정하는 방법은 없습니다.
fu DL

60

-cp인수를 사용하면 프로그램이 컴파일되거나 실행될 때 필요할 수있는 추가 클래스 또는 라이브러리에 대한 경로 와 같은 클래스 경로를 제공합니다. 함께 -jar하면 실행하고자하는 실행 JAR 파일을 지정합니다.

둘 다 지정할 수는 없습니다. 실행하려고하면 java -cp folder/myexternallibrary.jar -jar myprogram.jar실제로 작동하지 않습니다. 해당 JAR의 클래스 경로는 -cp인수가 아닌 매니페스트에 지정되어야합니다 .

여기여기에서 이에 대한 자세한 내용을 찾을 수 있습니다 .

추신 : -cp그리고 -classpath동의어입니다.


내 관심은 자원에 관한 것입니까? 그들이 사용하는 자원에 차이가 있습니까?
Reza

@Hesam 당신은 사이의 성능 차이에 대해 질문하는 경우 -cp-classpath다음, 아니, 아무런 차이가 없다.
Radu Murzea

1
아니! 나는 -cp (또는 -classpath)와 -jar 간의 성능 차이를 의미
레자

2
@Hesam -jar실행할 실행 가능한 JAR을 지정합니다. 함께 -cp하면 프로그램이 필요할 수있는 추가 클래스 / 라이브러리 경로 (들)을 지정합니다. 2는 매우 다른 목적을 가지고 있습니다.
Radu Murzea

@RaduMurzea, 우리가 그것들을 결합 할 때 실제로 작동 하지 않는다는 의미는 무엇입니까 ? 예java -jar PATH -cp PATH2
Pacerier

18

사용할 때 java -cp정규화 된 메인 클래스 이름을 제공해야합니다. 예 :

java -cp com.mycompany.MyMain

java -jar myjar.jarjar 파일을 사용할 때 폴더의 jar 파일에 포함 된 manifest.mf를 통해 기본 클래스에 대한 정보를 제공해야합니다 META-INF.

Main-Class: com.mycompany.MyMain


게시물을 살펴 보시겠습니까? -cp를 잘못된 방식으로 사용하고 있으며 실수를 수정하는 방법은 없습니다.
fu DL

10

java -cp CLASSPATH는 클래스 경로의 모든 코드를 지정하려는 경우 필요합니다. 이것은 코드 디버깅에 유용합니다.

jarred 실행 형식 : java -jar JarFile짧은 명령 하나로 앱을 시작하려는 경우 사용할 수 있습니다. 클래스 경로 항목에서 공백으로 구분 된 jar를 사용하여 MANIFEST에 추가 종속 jar 파일을 지정할 수 있습니다. 예 :

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

둘 다 성능면에서 비슷합니다.


게시물을 살펴 보시겠습니까? -cp를 잘못된 방식으로 사용하고 있으며 실수를 수정하는 방법은 없습니다.
fu DL

2

이미 말했듯이 -cp는 명령 줄에서 jvm에게 주 스레드에 사용할 클래스와 라이브러리를 찾을 수있는 위치 (클래스 경로 정의)를 알려주기위한 것입니다. -jar에서는 jar 파일 매니페스트에 정의 될 클래스 경로 및 주 클래스를 예상합니다. 그래서 다른 것은 명령 줄에서 사물을 정의하는 반면 다른 사람들은 jar 매니페스트에서 찾는 것입니다. 성능에는 차이가 없습니다. 동시에 사용할 수 없으며 -jar는 -cp를 재정의합니다.

-cp를 사용하더라도 매니페스트 파일을 확인합니다. 따라서 매니페스트에서 일부 클래스 경로를 정의하고 명령 줄에서 일부를 정의 할 수 있습니다. 이것은 빌드와 함께 제공하지 않거나 제공하고 싶지 않은 타사 jar에 대한 종속성이있을 때 특히 유용합니다 (예를 들어 설치 될 시스템에서 이미 발견 될 것으로 예상). 따라서 외부 항아리를 제공하는 데 사용할 수 있습니다. 위치는 시스템마다 다를 수 있으며 다른 시스템에서 다른 버전을 가질 수도 있습니다 (그러나 동일한 인터페이스를 가짐). 이렇게하면 다른 버전으로 앱을 빌드하고 다른 시스템에서 실행할 때 명령 줄의 클래스 경로에 실제 타사 종속성을 추가 할 수 있습니다.


1

성능면에서 차이가 없습니다. java-cp를 사용하여 Java 클래스 파일을 실행하기 위해 클래스 경로에 필요한 클래스와 jar를 지정할 수 있습니다.

실행 가능한 jar 파일 인 경우. java -jar 명령을 사용하면 jvm은 jar 파일 내의 /META-INF/MANIFEST.MF 파일에서 실행해야하는 클래스를 찾습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.