-
Notifications
You must be signed in to change notification settings - Fork 3
[공부] classPath란?
프로젝트 할 때, resource를 classPath로부터 찾는다고 한다. classPath가 무엇이길래, resources에 있는 파일들을 참조할 수 있는 것일까?
클래스패스(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를 나누어 경로를 저장하고 있다.
이렇게 경로만 저장되어있는데, 파일을 어떻게 찾아온다는 걸까?
이것을 알려면 프로젝트가 빌드 시에 무엇을 하는 지 더 알아볼 필요가 있다.
빌드 시에 java파일들은 컴파일 되어 .class파일로 변경되어 build패키지에 들어가게 된다.
그리고 resoucre파일들은 그대로 복사되어 build패키지에 들어가게 된다.
그러면 .class파일과 resouce파일들을 build패키지의 어디에 들어가게 될까?
예상했겠지만, 바로 위에 classPath에 있는 경로들에 저장이 된다.
class는 build\classes\java\main
resource는 build\resoures\main
에 저장된다.
만약 프로젝트에서 src/main/resources/static/css/test.css
가 있다고 가정해보자
- test.css를 찾기위해 getResource(”test.css”)를 시도
- 찾기 실패
- test.css를 찾기위해 getResource(”static/css/test.css”)를 시도
- 찾기 성공
파일들을 막무가내로 build/resources/main에 다 때려박는 것이 아니라, 원래 resources의 패키지구조 대로 복사해서 넣게 된다.
따라서 찾을 때, resourcecs아래부터 패키지구조 맞추어 경로를 넣어줘야 runtime중에 찾을 수 있다.
- getResource(”static/css/test.css”) 실행
- calssPath 리스트에서 위에서 부터 순차적으로 찾기 시작(classPath+자원이륻)
-
~생략\build\classes\java\main\stataic\css\test.css
있나? -
~생략\build\resources\main\stataic\css\test.css
있나?→찾음
-
이렇게 classPath가 무엇인지, 그리고 classPath를 통해 자원을 어떻게 찾는 지 알아보았다.
공부하면서 빌드 시에 무엇을 하는지, ClassLoader란 무엇인지 등등 여러 부가적인 것들 또한 더 상세히 알 수 있어 좋은 경험이었다.
누누
채드
에디
- PR에 대한 단위 테스트 자동화
- 반갑개 OAuth 2.0 로그인을 해보아요
- 네트워크 통신 에러 핸들링
- Unauthorized 에러 분기 처리
- Firebase Analytics 및 Crashlytics 를 활용하여 앱 사용자 데이터 수집
- Google Play Store 배포 자동화
벼리
도도
- [문제해결]서버 스웨거 접속이 왜 안될까?
- (문제해결) AWS S3 KEY정보 없이 보안 챙기며 Spring에 연동하기
- (문제해결) MockAPI 적용해보기
- (성능개선) DB 마이그레이션 서비스 무중단으로 해보기
- (성능개선) 사용자가 많아지면, 서버 한대로 버틸 수 있을까?
- [공부] 서버 실행 중, JAR파일을 삭제하면!?
- [[공부] classPath란?
땡이
위브
트레