Skip to content

[공부] classPath란?

김도선 edited this page Sep 6, 2024 · 1 revision

프로젝트 할 때, resource를 classPath로부터 찾는다고 한다. classPath가 무엇이길래, resources에 있는 파일들을 참조할 수 있는 것일까?

classPath란

클래스패스(ClassPath)는 JVM이 애플리케이션 실행 시 클래스 파일과 리소스 파일을 찾기 위해 참조하는 경로들의 목록이다.

경로들의 목록이라고 하면 이해가 잘 안될 수 있다.

그러니까 실제로 한번 보자

실제로 한번 보자

현재 하고 있는 프로젝트에서 클래스 패스를 출력해보았다.

String classPath = System.getProperty("java.class.path");

그 결과는

D:\Users\user\WoowacourseMain\Level4\java-http\tomcat\build\classes\java\main
D:\Users\user\WoowacourseMain\Level4\java-http\tomcat\build\resources\main
C:\Users\user\.gradle\caches\modules-2\files-2.1\jakarta.servlet\jakarta.servlet-api\5.0.0\2e6b8ccde55522c879434ddec3714683ccae6867\jakarta.servlet-api-5.0.0.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\org.reflections\reflections\0.10.2\b638d7ca0e0fe0146b60a0e7ba232ad852a73b31\reflections-0.10.2.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-classic\1.5.7\ad4ff8ca015737ade8e8a9de07de565c423e5b7a\logback-classic-1.5.7.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\org.apache.commons\commons-lang3\3.14.0\1ed471194b02f2c6cb734a0cd6f6f107c673afae\commons-lang3-3.14.0.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\org.javassist\javassist\3.28.0-GA\9a958811a88381bb159cc2f5ed79c34a45c4af7a\javassist-3.28.0-GA.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\com.google.code.findbugs\jsr305\3.0.2\25ea2e8b0c338a877313bd4672d3fe056ea78f0d\jsr305-3.0.2.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\org.slf4j\slf4j-api\2.0.15\35ed0d9a6b7c011bb8656087f79e371263b3b485\slf4j-api-2.0.15.jar
C:\Users\user\.gradle\caches\modules-2\files-2.1\ch.qos.logback\logback-core\1.5.7\ba0d0cbac3f21abd28faed3b4931d5b49cc5887e\logback-core-1.5.7.jar

‘어플리케이션 실행 중’ class파일 과 resource파일을 찾아야 하기에 build패키지를 참조하고 있는 모습이다.

이렇게 classPath는 어플리케이션 빌드 시에 build패키지에 class와 resource를 나누어 경로를 저장하고 있다.

이렇게 경로만 저장되어있는데, 파일을 어떻게 찾아온다는 걸까?

이것을 알려면 프로젝트가 빌드 시에 무엇을 하는 지 더 알아볼 필요가 있다.

빌드 시에 resouce파일들의 복사

빌드 시에 java파일들은 컴파일 되어 .class파일로 변경되어 build패키지에 들어가게 된다.

그리고 resoucre파일들은 그대로 복사되어 build패키지에 들어가게 된다.

그러면 .class파일과 resouce파일들을 build패키지의 어디에 들어가게 될까?

예상했겠지만, 바로 위에 classPath에 있는 경로들에 저장이 된다.

class는 build\classes\java\main

resource는 build\resoures\main

에 저장된다.

실수하기 쉬운 resource를 찾는 방법

만약 프로젝트에서 src/main/resources/static/css/test.css가 있다고 가정해보자

첫번째 방법

  1. test.css를 찾기위해 getResource(”test.css”)를 시도
  2. 찾기 실패

두번째 방법

  1. test.css를 찾기위해 getResource(”static/css/test.css”)를 시도
  2. 찾기 성공

왜?

image

파일들을 막무가내로 build/resources/main에 다 때려박는 것이 아니라, 원래 resources의 패키지구조 대로 복사해서 넣게 된다.

따라서 찾을 때, resourcecs아래부터 패키지구조 맞추어 경로를 넣어줘야 runtime중에 찾을 수 있다.

두번째 방법 순차적인 흐름

  1. getResource(”static/css/test.css”) 실행
  2. calssPath 리스트에서 위에서 부터 순차적으로 찾기 시작(classPath+자원이륻)
    1. ~생략\build\classes\java\main\stataic\css\test.css 있나?
    2. ~생략\build\resources\main\stataic\css\test.css 있나?→찾음

마무리

이렇게 classPath가 무엇인지, 그리고 classPath를 통해 자원을 어떻게 찾는 지 알아보았다.

공부하면서 빌드 시에 무엇을 하는지, ClassLoader란 무엇인지 등등 여러 부가적인 것들 또한 더 상세히 알 수 있어 좋은 경험이었다.

Clone this wiki locally