답변:
나는 함정이 적기 때문에 자바 애플리케이션을 시작하는 첫 번째 버전을 선호한다 ( "classpath hell에 오신 것을 환영합니다"). 두 번째 파일에는 실행 가능한 jar 파일이 필요하며 해당 애플리케이션의 클래스 경로는 jar의 매니페스트 내에 정의되어야합니다 (다른 모든 클래스 경로 선언은 자동으로 무시됩니다 ...). 따라서 두 번째 버전에서는 jar를 살펴보고 매니페스트를 읽고 jar가 저장된 위치에서 클래스 경로 항목이 유효한지 확인해야합니다. 피할 수 있습니다.
두 버전 모두 성능 이점이나 단점을 기대하지 않습니다. 메인 스레드에 사용할 클래스와 라이브러리를 찾을 수있는 위치를 jvm에게 알려주는 것입니다.
-cp
인수를 사용하면 프로그램이 컴파일되거나 실행될 때 필요할 수있는 추가 클래스 또는 라이브러리에 대한 경로 와 같은 클래스 경로를 제공합니다. 함께 -jar
하면 실행하고자하는 실행 JAR 파일을 지정합니다.
둘 다 지정할 수는 없습니다. 실행하려고하면 java -cp folder/myexternallibrary.jar -jar myprogram.jar
실제로 작동하지 않습니다. 해당 JAR의 클래스 경로는 -cp
인수가 아닌 매니페스트에 지정되어야합니다 .
여기 와 여기에서 이에 대한 자세한 내용을 찾을 수 있습니다 .
추신 : -cp
그리고 -classpath
동의어입니다.
-cp
와 -classpath
다음, 아니, 아무런 차이가 없다.
-jar
실행할 실행 가능한 JAR을 지정합니다. 함께 -cp
하면 프로그램이 필요할 수있는 추가 클래스 / 라이브러리 경로 (들)을 지정합니다. 2는 매우 다른 목적을 가지고 있습니다.
java -jar PATH -cp PATH2
java -cp CLASSPATH는 클래스 경로의 모든 코드를 지정하려는 경우 필요합니다. 이것은 코드 디버깅에 유용합니다.
jarred 실행 형식 : java -jar JarFile
짧은 명령 하나로 앱을 시작하려는 경우 사용할 수 있습니다. 클래스 경로 항목에서 공백으로 구분 된 jar를 사용하여 MANIFEST에 추가 종속 jar 파일을 지정할 수 있습니다. 예 :
Class-Path: mysql.jar infobus.jar acme/beans.jar
둘 다 성능면에서 비슷합니다.
이미 말했듯이 -cp는 명령 줄에서 jvm에게 주 스레드에 사용할 클래스와 라이브러리를 찾을 수있는 위치 (클래스 경로 정의)를 알려주기위한 것입니다. -jar에서는 jar 파일 매니페스트에 정의 될 클래스 경로 및 주 클래스를 예상합니다. 그래서 다른 것은 명령 줄에서 사물을 정의하는 반면 다른 사람들은 jar 매니페스트에서 찾는 것입니다. 성능에는 차이가 없습니다. 동시에 사용할 수 없으며 -jar는 -cp를 재정의합니다.
-cp를 사용하더라도 매니페스트 파일을 확인합니다. 따라서 매니페스트에서 일부 클래스 경로를 정의하고 명령 줄에서 일부를 정의 할 수 있습니다. 이것은 빌드와 함께 제공하지 않거나 제공하고 싶지 않은 타사 jar에 대한 종속성이있을 때 특히 유용합니다 (예를 들어 설치 될 시스템에서 이미 발견 될 것으로 예상). 따라서 외부 항아리를 제공하는 데 사용할 수 있습니다. 위치는 시스템마다 다를 수 있으며 다른 시스템에서 다른 버전을 가질 수도 있습니다 (그러나 동일한 인터페이스를 가짐). 이렇게하면 다른 버전으로 앱을 빌드하고 다른 시스템에서 실행할 때 명령 줄의 클래스 경로에 실제 타사 종속성을 추가 할 수 있습니다.
성능면에서 차이가 없습니다. java-cp를 사용하여 Java 클래스 파일을 실행하기 위해 클래스 경로에 필요한 클래스와 jar를 지정할 수 있습니다.
실행 가능한 jar 파일 인 경우. java -jar 명령을 사용하면 jvm은 jar 파일 내의 /META-INF/MANIFEST.MF 파일에서 실행해야하는 클래스를 찾습니다.