Java classpath 경로 가져오기 - java classpath gyeonglo gajyeoogi

path란

  • 운영체제가 사용하는 환경변수 (environment variable)
  • 실행 가능한 파일 또는 자바 바이트 클래스 경로
  • 리눅스, 맥 등 터미널에서 set CLASS_PATH=... 로 설정 가능 
  • echo $'환경변수 이름' 으로 설정된 환경변수 값 확인 가능 
    • echo $CLASS_PATH 

classpath란

  • classpath 또한 환경변수로 java compiler가 사용
  • runtime시 compiler가 클래스파일을 찾는 경로 (정확히는 class loader)
  • JVM이 프로그램을 실행할 때 class를 찾기 위해 사용 
    • terminal에서 javac로 실행 시 디폴트는 현재 경로 참고
    • OS의 환경변수로 설정한 CLASS_PATH를 참고할 수 있다. (bash_profile, profile,,)
    • Spring에서 제공하는 ClassPathResource 는 classpath에 저장된 파일을 쉽게 가져올 수 있도록 지원

ClassPathResource 예시 

  • src/main/resources/data/data.txt 경로에 위치한 파일 가져오기 
  • 다음 코드가 정상으로 실행된다면 src/main/resources 까지가 ClassPath에 등록된 것이다. 
ClassPathResource resource = new ClassPathResource("data/data.txt");

추가로 classpath관련 자세한 내용 참고 링크

https://effectivesquid.tistory.com/entry/자바-클래스패스classpath란

https://vvshinevv.tistory.com/70

buildpath란

  • 빌드 시 사용되는 자원을 가져오는 경로
    • 빌드란? 실행 가능한 파일로 산출하는 것
    • 빌드 과정
      • compile
      • 소스코드 Test
      • Test 수행(unit test 등)
      • Packaging(jar파일, war파일 등)
      • Health check(PMD, test coverage 등)
      • report 생성
  • eclipse에서 등록 시 source, projects, library로 구분되어 있는 것을 확인할 수 있다. 
    • 프로젝트 첫 빌드 시 build path 를 참고하여 프로젝트 경로에 .classpath 파일을 만든다.
Java classpath 경로 가져오기 - java classpath gyeonglo gajyeoogi
Java classpath 경로 가져오기 - java classpath gyeonglo gajyeoogi

.classpath에서 확인한 resourec 경로

참고

https://stackoverflow.com/questions/2650168/building-vs-compiling-java

http://june0313.github.io/2018/08/11/read-resource-file-on-spring/

https://www.linkedin.com/pulse/difference-between-path-classpath-shivani-verma

[JAVA] 현재 실행 Class 절대 경로 구하기

String currDir = [ClassName].class.getResource(".").getPath();

이 블로그의 인기 게시물

리눅스 특정 사용자 패스워드 초기화 방법 linux user password reset

1. root 계정 로그인 후 2. passwd -d [user 계정] -> 다음 해당 유저 로그인 시 비밀번호 재설정 해야 함.

[Tomcat] Tomcat 서버 Manager 페이지 접속하기

Java classpath 경로 가져오기 - java classpath gyeonglo gajyeoogi

Tomcat 테스트 서버에 import 된 jar 파일을 추가하고, 리로드 하기 위해 방법을 찾아보니 manager 페이지에 들어가서 하면 된단다... Tomcat 기본 페이지에서 "Manager App" 버튼 눌렀는데 갑자기 암호 물어본다... 헐. 암호 설정한 적이 없는거 같은디... 서버 로그인 계정과 암호 묻는줄 알고 입력 했더니.. 에러 페이지 뜨면서 머라고???? 읽어보니 설치폴더\conf\tomcat-users.xml 파일 수정하란다.. role 에 manager-gui 라는 권한을 할당해 주어야 한다. 아래와 같이 수정하고 나서. <role rolename="tomcat"/>   <role rolename="role1"/>   <role rolename="manager-gui"/>   <user username="tomcat" password="tomcat" roles="tomcat ,manager-gui"/>   <user username="both" password="tomcat" roles="tomcat,role1"/>   <user username="role1" password="tomcat" roles="role1"/> </tomcat-users> 기본상태는 전체가 주석처리 되있으니 수정할때 주석해제 잊지 말자...(또 한번의 삽질 ) 수정하고 나서 서버 재시작해야 한다... 접속하니 잘 된다...ㅋㅋ 이제 원하는 어플리케이션 서버 리로드 버튼 클릭하면 리로드 간단 해결된다... Ignorance is not the problem, the

자바 애플리케이션은 resource 디렉토리에 정적 파일을 저장합니다.

이 때 파일의 경로를 알기 위해서는 resource 디렉토리의 경로가 필요합니다.

이 때 resource 디렉토리의 경로를 가져오기 위해 ClassLoader를 활용합니다.

꼭 클래스 로더에 대한 지식이 필요하진 않습니다. 다만 궁금하신 분은 이 글을 읽어주세요!


resource 디렉토리의 경로 가져오기

resource의 디렉토리를 가져오기 위해 ClassLoader에 있는 getResource() 메소드를 사용합니다.

public URL getResource(String name)

이 메소드는 주어진 이름을 가진 자원을 찾으려고 시도합니다.

먼저 리소스의 상위 클래스 로더에 위임합니다. 부모가 null 이면 가상 머신에 빌드된 클래스 로더의 경로를 검색합니다.

실패하면 메서드는 findResource(String)  호출 하여 리소스를 찾습니다. 입력으로 지정된 리소스 이름은 classpath에 대해 상대적이거나 절대적일 수 있습니다.

리소스를 읽기 위한 URL 개체를 반환하거나 리소스를 찾을 수 없거나 호출자가 리소스를 반환할 수 있는 적절한 권한이 없는 경우 null을 반환합니다.

Java는 클래스 경로에서 리소스를 로드한다는 점에 유의하는 것이 중요합니다.

마지막으로 Java에서 리소스 로드 는 환경이 리소스를 찾도록 설정되어 있는 한 코드가 실행되는 위치가 중요하지 않기 때문에 위치가 독립적인 것으로 간주됩니다. 즉 Java 환경이 리소스를 찾도록 설정되어 있다면 어느 위치에서 실행하든 위치와 관계없이 실행됩니다. 

따라서 resource의 디렉토리 경로를 가져오기 위해서는 다음과 같이 할 수 있습니다.

URL resource = getClass().getClassLoader().getResource("리소스 이름");
String filePath = resource.getFile();

파일의 내용 읽기

리소스의 경로를 알아냈다면 파일의 내용을 읽을 수 있습니다.

URL resource = getClass().getClassLoader().getResource("리소스 이름") 로 리소스의 경로를 가져왔습니다.

Path path = new File(resource.getPath()).toPath();

List<String> contents = Files.readAllLines(path);

이렇게 진행하시면 파일 안에있는 모든 라인을 읽습니다. 단 Files.readAllLines() 메서드 내부적으로 UTF-8 로 디코딩을 진행합니다.