클래스 패스 란 무엇이며 어떻게 설정합니까?


324

나는이 줄을 읽고 있었다.

format () 메소드가하는 첫 번째 일은 output.vm이라는 클래스 경로에서 Velocity 템플릿을로드하는 것입니다.

이 맥락에서 classpath의 의미와 classpath를 설정하는 방법을 설명하십시오.

답변:


530

Java로 프로그래밍 할 때 소스 파일의 맨 위에 다음과 같은 것을 넣어서 작성중인 클래스에서 다른 클래스를 사용할 수있게합니다.

import org.javaguy.coolframework.MyClass;

또는 때로는 다음과 같이 말하여 가져 오기를 '대량 가져 오기'합니다.

import org.javaguy.coolframework.*;

따라서 프로그램에서 나중에 말할 때 :

MyClass mine = new MyClass();

Java Virtual Machine은 컴파일 된 클래스를 찾을 위치를 알고 있습니다.

VM이 컴퓨터의 모든 폴더를 살펴 보도록하는 것은 실용적이지 않으므로 VM에 찾을 장소 목록을 제공해야합니다. 이것은 클래스 경로에 폴더 및 jar 파일을 넣어 수행됩니다.

클래스 경로 설정 방법에 대해 설명하기 전에 .class 파일, 패키지 및 .jar 파일에 대해 이야기 해 봅시다.

먼저 MyClass가 프로젝트의 일부로 빌드 한 것으로 가정하고 프로젝트의 디렉토리에 있습니다 output. .class 파일은 output/org/javaguy/coolframework/MyClass.class해당 패키지의 다른 모든 파일과 함께 있습니다. 해당 파일에 접근하려면 import 문은 모든 정보를 VM에 제공하기 때문에 전체 패키지 구조가 아니라 'output'폴더를 포함해야합니다.

이제 CoolFramework를 .jar 파일로 묶고 해당 CoolFramework.jar를 프로젝트의 lib 디렉토리에 넣었다고 가정 해 봅시다. 이제 lib/CoolFramework.jar클래스 경로 에 넣어야 합니다. VM은 jar 파일 내부에서 해당 org/javaguy/coolframework부분을 ​​찾고 클래스를 찾습니다.

따라서 클래스 경로에는 다음이 포함됩니다.

  • JAR 파일
  • 패키지 계층의 최상위 경로.

클래스 패스를 어떻게 설정합니까?

모두가 배우는 첫 번째 방법은 환경 변수를 사용하는 것입니다. 유닉스 머신에서는 다음과 같이 말할 수 있습니다.

export CLASSPATH=/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/

Windows 시스템에서는 환경 설정으로 이동하여 이미 존재하는 값을 추가하거나 수정해야합니다.

두 번째 방법은 -cp다음과 같이 Java를 시작할 때 매개 변수 를 사용하는 것입니다.

java -cp "/home/myaccount/myproject/lib/CoolFramework.jar:/home/myaccount/myproject/output/"  MyMainClass

이것의 변형은 클래스 경로를 계산하고 매개 변수 를 통해 Java로 전달 하는 .sh또는 .bat파일로 종종 수행되는 세 번째 방법입니다 -cp.

위의 모든 "gotcha"가 있습니다. 대부분의 시스템 (Linux, Mac OS, UNIX 등)에서 콜론 문자 ( ':')는 클래스 경로 구분 기호입니다. windowsm에서 구분 기호는 세미콜론 ( ';')입니다.

가장 좋은 방법은 무엇입니까?

환경 변수를 통해 전역으로 물건을 설정하는 것은 일반적으로 전역 변수가 나쁜 것과 같은 이유로 나쁜 것입니다. 한 프로그램이 작동하도록 CLASSPATH 환경 변수를 변경하면 다른 프로그램이 중단됩니다.

-cp가가는 길입니다. 나는 일반적으로 CLASSPATH 환경 변수가 가능한 한 항상 개발되는 빈 문자열인지 확인하여 전역 클래스 경로 문제를 피합니다 (글로벌 클래스 경로가 비어있을 때 일부 도구는 행복하지 않습니다. 명령 줄 도구와 관련하여 이러한 종류의 문제가있는 달러 라이센스 J2EE 및 Java 서버).


12

파이썬에는 간단한 import 문으로 언제든지 사용할 모듈을 저장할 수있는 Lib라는 폴더가 있습니다. 이는 CLASSPATH 환경 변수를 타사 Java 패키지의 디렉토리로 설정하는 것과 다른가요? 전역 적이지만 패키지를 더 추가하는 것 외에 변수를 변경할 필요가 없습니다.
Josie Thompson

좋은 대답이지만 여기에있는 인형의 경우 : 새로 만드는 모든 클래스에 대해 -cp 명령을 사용할 필요가없는 이유는 무엇입니까? 이것은 확실히 시스템에 의해 자동으로 해결됩니까? 그러나 어떻게? 클래스 클래스에서 "뭔가"를 찾을 수없는 문제가 발생하는 경우가 있습니다. cp에 추가하지 않았기 때문에 발생하는 것 같습니다. 왜 그런 오류가 항상 발생하는 대신 항상 발생합니까? 솔직히 말해서, 나는 -cp 명령으로 수동으로 아무것도 포함하지 않았고 그런 오류로 무엇을 해야할지 알지
못했기 때문에 이것을 묻습니다

2
@Vic 클래스 경로는 패키지 이름에 해당하는 디렉토리 계층 위의 디렉토리를 포함해야합니다. 따라서 org.javaguy.coolfw해당 디렉토리 구조 /path/to/org/javaguy/coolfw/로 클래스 경로를 포함해야합니다 /path/to/. org.javaguy.hotfw같은 프로젝트에 새 패키지 를 추가 하면 결과 클래스는 (일반적으로)로 끝납니다 /path/to/org/javaguy/hotfw/. 이를 위해서는 클래스 경로에 /path/to/이미 포함되어 있어야합니다 . 따라서 새로운 패키지 (및 그 안에 포함 된 클래스)는 클래스 경로에 새로운 추가를 요구하지 않습니다.
tjalling

@Vic보다 구체적인 예제와 설명 은 Java CLASSPATH 마스터 링 ( KNU 우수 의견 )
tjalling

67

PATH 환경 변수에 대한 Java의 대답으로 생각하십시오. OS는 PATH에서 EXE를 검색하고 Java는 클래스 경로에서 클래스 및 패키지를 검색합니다.


13

클래스 경로는 Java Virtual Machine이 Java 프로그램에서 사용자 정의 클래스, 패키지 및 리소스를 찾는 경로입니다.

이 컨텍스트에서 format()메소드는이 경로에서 템플리트 파일을로드합니다.


5

이 컨텍스트의 클래스 경로는 일반 컨텍스트와 정확히 일치합니다. VM이로드 할 클래스를 찾을 수있는 모든 위치와 리소스 (예 : output.vm)가 있습니다.

Velocity는 "no package"에서 output.vm이라는 파일을 찾을 것으로 예상합니다. 이것은 JAR, 일반 폴더 일 수 있습니다. ... 응용 프로그램의 클래스 경로에있는 모든 위치의 루트입니다.


2

CLASSPATH 시스템 변수 설정

현재 CLASSPATH 변수를 표시하려면 Windows 및 UNIX (Bourne 쉘)에서 다음 명령을 사용하십시오. Windows : C:\> set CLASSPATH UNIX : % echo $CLASSPATH

CLASSPATH 변수의 현재 내용을 삭제하려면 다음 명령을 사용하십시오. Windows : C:\> set CLASSPATH= UNIX : % unset CLASSPATH; export CLASSPATH

CLASSPATH 변수를 설정하려면 다음 명령을 사용하십시오 (예 :) Windows : C:\> set CLASSPATH=C:\users\george\java\classes UNIX : % CLASSPATH=/home/george/java/classes; export CLASSPATH


1
이러한 명령은 환경 변수 작업에 유용 할 수 있지만 질문에 대한 답변은 아닙니다.
Hulk

1

클래스 경로는 시스템의 환경 변수입니다. 이 변수의 설정은 모든 패키지 계층의 루트를 Java 컴파일러에 제공하는 데 사용됩니다.


1

CLASSPATH는 Java 컴파일러 및 런타임에서 Java 프로그램에 사용 된 Java 패키지를 찾는 데 필요한 환경 변수 (즉, 모든 프로세스에서 사용 가능한 운영 체제의 전역 변수)입니다. (PACKAGEPATH를 호출하지 않는 이유는 무엇입니까?) 이것은 다른 환경 변수 PATH와 유사합니다.이 변수는 CMD 쉘에서 실행 프로그램을 찾기 위해 사용합니다.

CLASSPATH는 다음 방법 중 하나로 설정 될 수 있습니다.

CLASSPATH can be set permanently in the environment: In Windows, choose control panel  System  Advanced  Environment Variables  choose "System Variables" (for all the users) or "User Variables" (only the currently login user)  choose "Edit" (if CLASSPATH already exists) or "New"  Enter "CLASSPATH" as the variable name  Enter the required directories and JAR files (separated by semicolons) as the value (e.g., ".;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar"). Take note that you need to include the current working directory (denoted by '.') in the CLASSPATH.

To check the current setting of the CLASSPATH, issue the following command:

> SET CLASSPATH

CLASSPATH can be set temporarily for that particular CMD shell session by issuing the following command:

> SET CLASSPATH=.;c:\javaproject\classes;d:\tomcat\lib\servlet-api.jar

Instead of using the CLASSPATH environment variable, you can also use the command-line option -classpath or -cp of the javac and java commands, for example,

> java classpath c:\javaproject\classes com.abc.project1.subproject2.MyClass3

0

객체 인스턴스를 만들지 않고 클래스의 정적 멤버를 직접 호출 할 수 있습니다. 기본 메소드는 정적 Java 가상 머신이므로 프로그램의 시작점 인 기본 메소드를 포함하는 클래스의 인스턴스를 작성하지 않고 호출 할 수 있습니다.


0

리눅스 사용자와 다른 사람들이 여기에 말한 것을 요약하고 추가하려면 다음을 알아야합니다.

  1. $ CLASSPATH는 Java가 여러 디렉토리를 조사하여 스크립트에 필요한 모든 다른 클래스를 찾기 위해 사용하는 것입니다 (명시 적으로 -cp 재정의를 사용하여 명시하지 않는 한). -cp를 사용하려면 모든 디렉토리를 수동으로 추적하고 프로그램을 실행할 때마다 해당 행을 복사하여 붙여 넣어야합니다 (바람직한 IMO는 아님).

  2. 콜론 ( ":") 문자는 다른 디렉토리를 구분합니다. $ CLASSPATH는 하나 뿐이며 모든 디렉토리가 있습니다. 따라서 "export CLASSPATH = ...."를 실행할 때 현재 값 "$ CLASSPATH"를 추가하여 추가하려고합니다. 예를 들면 다음과 같습니다.

    export CLASSPATH=.
    export CLASSPATH=$CLASSPATH:/usr/share/java/mysql-connector-java-5.1.12.jar

    위의 첫 번째 줄에서, 현재 작업 디렉토리의 경로 인 간단한 '점'으로 CLASSPATH를 시작하십시오. 이를 통해 Java를 실행할 때마다 현재 작업 디렉토리 (현재있는 디렉토리)에서 클래스를 찾습니다. 위의 두 번째 줄에서 $ CLASSPATH는 이전에 입력 한 값 (.)을 잡고 mysql 디렉토리에 경로를 추가합니다. 이제 java는 드라이버와 클래스를 찾습니다.

  3. echo $CLASSPATH

    매우 편리하며 반환되는 것은 모든 디렉토리와 .jar 파일의 콜론으로 구분 된 목록과 같이 읽어야합니다 .Java는 필요한 클래스를 찾고 싶습니다.

  4. Tomcat은 CLASSPATH를 사용하지 않습니다. https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html에서 이에 대해 수행 할 작업을 읽으십시오.

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