Java ClassPath란..

홍석진·2021년 5월 11일
3

JAVA

목록 보기
7/10

오늘은 오랜만에 글을 올리는데 (요새 너무 바빠서 학점은행제랑 프로젝트과제 병행때문에) jsp를 공부하다가 기본 소양이라하는 classpath에 관하여 정리를 해보고자 합니다.
안그래도 최근에 jsp공부할때 이미지 경로 표시를 이런식으로 표기하고 있었다. 여기앞에 'request.getContextPath()'는 절대경로로서 역할을해서 ContextPath의 역할인데 classpath와 밀접한 관련이 있지 않을 까가 이 정리에 시작이다.

클래스 패스란?

클래스(class)를 찾기 위한 경로(path) 이다. 자세하게는 자바 사용시 JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 기준이 되는 파일경로를 말한다.
소스코드 (.java)를 컴파일하면 소스 코드가 "바이트 코드(.class 가상머신에서 이해할 수 있는 코드를 위한 이진표현법 0 1 구성) 컴파일로 인하여 컴퓨터가 읽는 이진코드로 변환하는 과정인데 이 때 .class 파일을 찾을 때 Classpath에 지정된 경로를 사용한다. Classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론(:)으로 구분한 목록이다.
클래스 패스를 사용하는 것에는 두가지 방법이 있다.
환경변수 CLASSPATH를 사용하는방법, java runtime에 classpath 플레그를 사용하는 방법.
(-classpath) 플래그를 사용하는 방법.(예를 들어 java -classpath ".;item" Main.java)
여기서 '.'은 현재위치 ';'은 다랙토리를 구분하는 구분자이다.'.;item'의 의미는 현재위치에서 찾아보고 없으면 하위 디렉토리인 item에서 찾아보라는 의미이다.

classpath의 값

classpath는 ':'으로 구분된 디렉토리 및 파일 목록으로서 세 가지 유형의 파일과 디렉토리를 지정가능하다.
1. /export/home/username/java/classes와 같은 디렉토리
2. myclasses.zip과 같은 zip 파일
3. myclasses.jar와 같은 jar(자바 아카이브) 파일

클래스 패스의 사용법

패키지에 포함되지 않은 java 소스파일을 컴파일할 때 classpath를 사용하게 된다.

여기서는 예제하나를 퍼왔다.
.java 파일 이름을 codingsquid.java로 지정했다고 가정하자. 그런 다음 ‘javac codingsquid.java’ 명령을 사용해서 파일을 컴파일하자. 그러면 javac 명령을 실행한 디렉토리에 컴파일된 .class 파일이 생성된다. 이 디렉토리를 /export/home/username이라고 가정하자. 그럼 이 디렉토리에 /export/home/username/codingsquid.class라는 파일이 생기는데 codingsquid.java 파일에 포함된 java 프로그램을 실행하려면 다음과 같이 classpath를 설정해야 한다.

CLASSPATH=/export/home/username

현재 작업 디렉토리가 /export/home/username이면 다음과 같이 간단하게 classpath를 설정할 수 있다.

CLASSPATH=.

다른 디렉토리(예: /export/home/username/util)에 클래스 파일이 더 있으면, 다음과 같이 classpath를 설정해야 한다.

CLASSPATH=/export/home/username:/export/home/username/util

util 디렉토리에 유용한 java 클래스가 많이 있으면 util.jar라는 jar 파일에 모두 묶을 수 있다. (/export/home/username/util/util.jar이라는 파일이 생긴다.) 그러면 다음과 같이 classpath를 설정해야 한다.

CLASSPATH=/export/home/username:/export/home/username/util/util.jar

지금까지는 classpath가 간단하지만 패키지를 사용하기 시작하면 복잡해진다. 패키지는 java에서 관련 기능에 따라 클래스를 계층 구조로 연결하는 방법이다. (좋은 예로 java.awt 패키지가 있다. java.awt 패키지에는 GUI(예: 버튼, 텍스트 필드, 창 등)와 연결된 클래스 그룹이 포함되어 있다. 자신의 패키지를 만들 수도 있다.) java에서는 .java 소스 파일의 첫 번째 행에 패키지 명령을 추가하는 방법으로 클래스가 패키지에 포함되었음을 나타낼 수 있다. MyCompany.Util 패키지를 생성하려면 다음 행을 java 소스 파일에 추가해야 한다.

package MyCompany.Util;

/export/home/username/util/codingsquid.java라는 파일이 있고, codingsquid.java 파일에 이 파일이 MyCompany.Util 패키지에 포함되었음을 나타내는 행이 있다고 가정하자. /export/home/username/util 디렉토리로 이동해서 다음 명령으로 codingsquid.java 파일을 컴파일하면 /export/home/username/util/codingsquid.class 파일이 생긴다.

javac codingsquid.java

그러나 다음 명령으로 프로그램을 실행하려고 하면, codingsquid 클래스를 찾을 수 없기 때문에 java runtime이 프로그램을 실행하지 못한다.

CLASSPATH=/export/home/username/util

java codingsquid

이것은 codingsquid 클래스의 실제 이름이 MyCompany.Util.codingsquid이기 때문이다.(패키지에 추가했기 때문). 이 java 프로그램을 실행하려면 대신 다음 명령을 사용해야 한다.

CLASSPATH=/export/home/username/util

java MyCompany.Util.codingsquid

java에서는 현재 작업 디렉토리 대신 다른 디렉토리를 클래스 파일의 디렉토리로 지정할 수 있다. 이것을 지정할 때 -d 플래그를 사용한다. 예를 들어, 다음과 같이 사용한다.

javac -d /export/home/username/util codingsquid.java

이렇게 지정하고 컴파일하면 /export/home/username/util 디렉토리에 클래스 파일이 생성되지만, /export/home/username/util 디렉토리 대신 MyCompany/Util이라는 하위 디렉토리를 만들어서 클래스 파일을 넣는다. 위의 javac 명령을 실행하면 결과로 /export/home/username/util/MyCompany/Util/codingsquid.class 파일이 생성된다. -d 플래그를 사용하면 소스 파일에 사용한 패키지 이름에 해당하는 디렉토리를 만든다(해당 디렉토리가 없을 경우). -d 플래그를 사용하지 않으면 이 디렉토리가 생성되지 않는다. 이 시나리오에서 java 프로그램을 실행하려면 다음과 같이 classpath를 지정하고 java 명령을 실행해야 한다.

CLASSPATH=/export/home/username/util

java MyCompany.Util.codingsquid

기본적으로 패키지 하위 디렉토리가 있는 루트 디렉토리를 지정해야 한다. 클래스 파일이 /export/home/username/util/MyCompany/Util 디렉토리에 있어도 classpath에 /export/home/username/util 경로를 지정해야 한다. java는 설치 디렉토리에서 MyCompany/Util 디렉토리를 찾습니다. 또 패키지에 포함할 java 클래스를 생성할 경우에는 .jar 및 .zip 파일에 이 클래스를 넣을 수도 있다. 위의 시나리오에서 유틸리티 클래스가 포함된 jar 파일을 생성하려면 다음 명령을 사용해야 한다.

cd /export/home/username/util

jar -cvf util.jar MyCompany/Util/*.class

그러면 내부에 MyCompany 및 MyCompany/Util 하위 디렉토리가 포함된 jar 파일이 생성되는데, 이 jar 파일을 사용하려면 다음 명령을 실행하면 된다.

CLASSPATH=/export/home/username/util/util.jar

java MyCompany.Util.codingsquid

참고: 클래스 파일이 단순한 자바 클래스인지 아니면 패키지에 포함된 java 클래스인지 쉽게 구별할 수 없다. /export/home/username/util/MyCompany/Util/codingsquid.class 파일을 보면 클래스 이름이 MyCompany.Util.codingsquid일 가능성이 많지만, 반드시 그런 것은 아니다. 개발자가 디렉토리를 만들고 codingsquid 클래스를 패키지에 넣지 않았을 수도 있다. 대부분의 경우에 이런 상황을 걱정할 필요는 없지만, 컴파일러가 클래스를 찾을 수 없는 문제가 발생하면 이런 경우를 생각해야 한다.

[출처]https://effectivesquid.tistory.com/entry/%EC%9E%90%EB%B0%94-%ED%81%B4%EB%9E%98%EC%8A%A4%ED%8C%A8%EC%8A%A4classpath%EB%9E%80

정리를 마치며

패키지 공부를 하면서 집고 넘어갔어야 하는 부분이었는데 jsp를 배우니까 그제서야 쳐다본 것 같아서 살짝 부끄럽긴하다. 계속 자바스크립트나 jsp할때 경로에 대한 이해도가 많이 떨어진다고 생각 했는데 classpath를 살펴보니 이해가 가는듯 싶다

profile
질문이나 의견이 있으시면 남겨주세요. 서로의 발전이라고 생각합니다.

0개의 댓글