유지보수 프로젝트에 들어가거나, 기존 업무 환경에서 작업해야할 경우 자신이 사용하고 있는 클래스가 위치한 위치를 찾고 싶은 경우가 있다.
다음과 같은 경우가 필요한 예일 것이다.
- 실제 파일 위치를 확인 하기 위해서
- NoSuchMethodError 가 날경우
1. 실제 파일 위치를 찾기 위한 경우
해당 클래스가 위치한 실제 파일을 찾을 경우는 여러가지가 있다.
공통 jar 를 누군가가 배포해놓았는데, 교체를 해야하는데 어딨는지 도통 모르겠다거나,
그놈의 파일을 얻어다가 디컴파일 하고 싶은 욕구가 생길 경우가 그럴 경우다.
2. NoSuchMethodError 가 날 경우
이 에러가는 나는 이유는 명백하다. 해당하는 클래스에 호출하는 메소드(메서드명과 인자가 일치하는) 가 없을 경우에 발생한다.
이 에러는 보통 다음과 같은 케이스에 발생하기 쉽다.
- 런타임 환경에 배포를 안했을 때
- 클래스 패스가 여러개 있어서, 우선순위가 높은 클래스패스에 이미 해당 클래스가 올려져 있을 때
런타임 환경에 배포를 안 했을 경우에는 참으로 기본적인 것이라 설명하는 것조차 무색하지만
후자의 경우에 많은 개발자들이 당황하기 쉽상이다.
즉, 다른 놈의 jar 안에 동일한명의 클래스가 올려져 있어서 이미 배포가 되어있는데 그것을 모르고 "배포했는데 왜 안되지? 왜 안되지?내렸다 올려도 안되네?" 하는 경우다.
하지만 프로그램은 참으로 정직하다.
대개 많은 개발자들이
내가 운영하고 있는 것도 아니고, 서버 구성도 모르는데 제가 어떻게 압니까? 나 몰라요 몰라
할지 모르겠으나, 자바가 클래스 로드하는 개념만 분명히 알고 있다면 전혀 두려워 할 필요가 없을 거이다.
배포된 파일을 찾고자 할 경우에 해당하는 패키지명과 클래스는 개발자는 분명히 알고 있을것이다.
다음과 같이 작성하여 출력해보면 해당 위치를 찾을 수 있다.
java.net.URL r = this.getClass().getClassLoader().getResource("nts/toolkit/EnvelopedMessage.class");
System.out.println(r.toString());
이 예는 nts.toolkit.EnvelopedMessage.class 가 어딨는지 출력하는 예이다. 이것을 출력하면 다음과 같은 출력을 볼 수 있다.
jar:file:/sys0.d/jeusdev2/jeus5/lib/application/NtsApi.jar!/nts/toolkit/EnvelopedMessage.class
이 말인 즉슨 jar 파일로 만들어져 있으며 jar 파일은 /sys0.d/jeusdev2/jeus5/lib/application/NtsApi.jar 이고 그 안에 nts.toolkit.EnvelopedMessage.class 가 있다는 뜻이다.
내가 안했다고 두려워하지 말길,,,
이 글은 스프링노트에서 작성되었습니다.